带有'或'条件的MongoDB查询

时间:2010-01-05 17:57:45

标签: mongodb

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

我想查询群组的当前成员。 “当前”表示开始时间小于当前时间,过期时间大于当前时间或空。

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

有什么想法吗?非常感谢提前。

6 个答案:

答案 0 :(得分:89)

以为我会更新以防万一将来在这个页面上遇到任何问题。从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}]}

答案 1 :(得分:46)

如果有人发现它有用,www.querymongo.com会在SQL和MongoDB之间进行转换,包括OR子句。当你知道SQL等价物时,找出语法真的很有帮助。

对于OR语句,它看起来像这样

SQL:

SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string';

MongoDB的:

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

答案 2 :(得分:5)

Query objects in Mongo by default AND expressions together. Mongo currently does not include an OR operator for such queries, however there are ways to express such queries.

使用“in”或“where”。

它会是这样的:

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

答案 3 :(得分:3)

条件为“或”的MongoDB查询

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

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

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

答案 4 :(得分:2)

使用$where查询会很慢,部分原因是它无法使用索引。对于这类问题,我认为最好为“expires”字段存储一个高值,该字段自然总是大于Now()。您可以在将来存储数百万年的非常高的日期,或者使用单独的类型来表示从不。跨类型排序顺序在here定义。

空的正则表达式或MaxKey(如果您的语言支持它)都是不错的选择。

答案 5 :(得分:2)

db.Lead.find(

{"name": {'$regex' : '.*' + "Ravi" + '.*'}},
{
"$or": [{
    'added_by':"arunkrishna@aarux.com"
}, {
    'added_by':"aruna@aarux.com"
}]
}

);