【问题标题】:MongoDB query with an 'or' condition带有“或”条件的 MongoDB 查询
【发布时间】:2021-10-25 23:52:47
【问题描述】:

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

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

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

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

【问题讨论】:

标签: mongodb


【解决方案1】:

只是想我会更新以防万一将来有人偶然发现此页面。从 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}]}

【讨论】:

    【解决方案2】:

    如果有人觉得它有用,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"
        }]
    });
    

    【讨论】:

      【解决方案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】:

        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 ); } } );
        

        【讨论】:

        • 很酷,我第一次看到Mongo使用的函数!我想当然的缺点是它不会使用索引
        • 这是一个非常古老的答案。同时,MongoDB 新增了$or
        【解决方案5】:

        db.Lead.find(

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

        );

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2021-01-11
            • 2017-02-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-29
            • 1970-01-01
            • 2022-11-09
            相关资源
            最近更新 更多