带有'或'条件的MongoDB查询

SFE*_*ley 62 mongodb

所以我有一个跟踪组成员身份的嵌入式文档.每个嵌入的文档都有一个ID,指向另一个集合中的组,开始日期和可选的过期日期.

我想查询组的当前成员."当前"表示开始时间小于当前时间,并且到期时间大于当前时间OR null.

这个条件查询完全阻止了我.我可以通过运行两个查询并合并结果来实现,但这看起来很难看,需要立即加载所有结果.或者我可以将过期时间默认为在遥远的未来某个任意日期,但这似乎更加丑陋且可能更脆弱.在SQL中,我只是用"(expires> = Now())OR(expires IS NULL)表达它" - 但我不知道如何在Mongo中这样做.

有任何想法吗?首先十分感谢.

mst*_*arn 98

我以为我会更新,以防将来有人在这个页面上发现错误.从1.5.3开始,mongo现在支持一个真正的$或运算符:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

您对"(expires> = Now())OR(过期IS NULL)"的查询现在可以呈现为:

{$or: [{expires: {$gte: new Date()}}, {expires: null}]}
Run Code Online (Sandbox Code Playgroud)


小智 55

如果有人发现它有用,www.querymongo.com会在SQL和MongoDB之间进行转换,包括OR子句.当您知道SQL等价物时,确定语法会非常有用.

在OR语句的情况下,它看起来像这样

SQL:

SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string';
Run Code Online (Sandbox Code Playgroud)

MongoDB的:

db.collection.find({
    "$or": [{
        "columnA": 3
    }, {
        "columnB": "string"
    }]
});
Run Code Online (Sandbox Code Playgroud)


小智 6

带有“或”条件的 MongoDB 查询

db.getCollection('movie').find({$or:[{"type":"smartreply"},{"category":"small_talk"}]})
Run Code Online (Sandbox Code Playgroud)

结合“或”、“和”条件的 MongoDB 查询。

db.getCollection('movie').find({"applicationId":"2b5958d9629026491c30b42f2d5256fa8",$or:[{"type":"smartreply"},{"category":"small_talk"}]})
Run Code Online (Sandbox Code Playgroud)


non*_*ont 5

默认情况下将Mongo中的对象和表达式一起查询.Mongo目前不包含用于此类查询的OR运算符,但是有方法可以表达此类查询.

使用"in"或"where".

它会是这样的:

db.mycollection.find( { $where : function() { 
return ( this.startTime < Now() && this.expireTime > Now() || this.expireTime == null ); } } );
Run Code Online (Sandbox Code Playgroud)