具有“或”条件的MongoDB查询


77

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

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

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

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


Answers:



66

万一有人觉得有用,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"
    }]
});

4

默认情况下,将Mongo中的对象与表达式一起查询。Mongo当前不包含用于此类查询的OR运算符,但是存在表达此类查询的方法。

使用“在”或“在”。

它会是这样的:

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

非常酷,我第一次看到Mongo使用的功能!!我想当然有个缺点,那就是它不会使用索引
Nico

这是一个非常古老的答案。同时,MongoDB添加了$or
Dan Dascalescu


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"}]})

2

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.