给出查询
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操作构造此查询, 因为它多次使用$或运算符。
但要么我不理解,要么这不是解释: - )
答案 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
}
}]
}]
})