使用“或”条件的MongoDB查询

96

我有一个嵌入式文档,用于跟踪组成员资格。每个嵌入式文档都有一个指向另一个集合中的组的ID、开始日期和可选到期日期。

我想查询当前组的成员。"当前"意味着开始时间小于当前时间,并且到期时间大于当前时间或为null。

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

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


类似问题:https://dev59.com/SUrSa4cB1Zd3GeqPafPb - Alexander Azarov
6个回答

153

85

如果有人发现它有用的话,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"
    }]
});

20

MongoDB查询使用 'or' 条件

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

使用'or'、'and'条件组合的MongoDB查询。

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

5

很酷,我第一次看到Mongo使用函数!当然,缺点是它不会使用索引。 - Nico
1
这是一个非常旧的答案。此时,MongoDB 已添加了 $or - Dan Dascalescu

4

db.Lead.find(

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

);


2
使用$where查询会很慢,部分原因是它无法使用索引。对于这种问题,我认为最好存储一个“过期”字段的高值,该值自然始终大于Now()。您可以存储一个非常遥远的日期,例如未来数百万年,或使用单独的类型来表示“永不”。跨类型排序顺序在此处定义。
空正则表达式或MaxKey(如果您的语言支持)都是不错的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接