88

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

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

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

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

4

6 回答 6

135

只是想我会更新以防万一将来有人偶然发现此页面。从 1.5.3 开始,mongo 现在支持真正的 $or 运算符:http ://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

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

{$or: [{expires: {$gte: new Date()}}, {expires: null}]}
于 2010-07-02T05:59:55.383 回答
70

如果有人觉得它有用,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"
    }]
});
于 2012-12-13T16:37:09.270 回答
12

带有“或”条件的 MongoDB 查询

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

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

db.getCollection('movie').find({"applicationId":"2b5958d9629026491c30b42f2d5256fa8",$or:[{"type":"smartreply"},{"category":"small_talk"}]})
于 2020-06-20T16:30:16.107 回答
4

在 Mongo 中查询对象默认 AND 表达式一起。Mongo 目前不包括用于此类查询的 OR 运算符,但是有一些方法可以表达此类查询。

使用“在”或“在哪里”。

它会是这样的:

db.mycollection.find( { $where : function() { 
return ( this.startTime < Now() && this.expireTime > Now() || this.expireTime == null ); } } );
于 2010-01-05T18:16:07.390 回答
4

db.Lead.find(

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

);

于 2018-12-05T07:20:50.960 回答
2

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

空的 Regex 或 MaxKey(如果您的语言支持)都是不错的选择。

于 2010-01-20T23:33:16.093 回答