Mongodb find()查询条件隐含AND?

时间:2015-05-12 12:07:56

标签: mongodb mongodb-query

给出查询

var p_other = 111;
var p_timestamp = ISODate("2015-05-08T07:00:00.000Z");
db.test.find({
    other: p_other,
    $or: [ 
        { "startTime": null },
        { "startTime": { $lte: p_timestamp }}
    ],
    $or: [ 
        { "endTime": null },
        { "endTime": { $gte: p_timestamp }}
    ]
})

以下数据:

{
    "_id" : "1",
    "other" : 111,
    "startTime" : ISODate("2015-05-08T07:01:30.868Z")
}
{
    "_id" : "2",
    "other" : 111,
    "startTime" : ISODate("2015-05-08T06:04:30.040Z"),
    "endTime" : ISODate("2015-05-08T07:01:30.868Z")
}

两个文档都被返回,我只期望第二个文档。 运行explain()我得到以下解析的查询:

"parsedQuery" : {
    "$and" : [
        {
            "$or" : [
                {
                    "endTime" : {
                        "$eq" : null
                    }
                },
                {
                    "endTime" : {
                        "$gte" : ISODate("2015-05-08T07:00:00.000Z")
                    }
                }
            ]
        },
        {
            "other" : {
                "$eq" : 111
            }
        }
    ]
}

第一个$or被忽略的原因是什么? 据我所知,find()的标准表达式之间应该存在隐式AND,尽管文档中没有提及(至少没有here)。 关于多个$or的使用的唯一提及是$and doc

  

无法使用隐式AND操作构造此查询,   因为它多次使用$或运算符。

但要么我不理解,要么这不是解释: - )

1 个答案:

答案 0 :(得分:0)

请仔细阅读$and的文件。你会发现以下 -

当多次使用$or运算符时,无法使用隐式AND运算构建查询。

以下查询将为您提供所需的结果:

var p_other = 111;
var p_timestamp = ISODate("2015-05-08T07:00:00.000Z");
db.collection.find({
other: p_other,
$and: [{
    $or: [{
        "startTime": null
    }, {
        "startTime": {
            $lte: p_timestamp
        }
    }]
}, {
    $or: [{
        "endTime": null
    }, {
        "endTime": {
            $gte: p_timestamp
        }
    }]
}]
})