这有效:
$match: {
$and:
[{
status: {$lt: 4},
checkin: {$gte: 1490720400, $lte: 1490806799}
}]
}
这不是:
$match: {
$and:
[{
status: {$lt: 4},
checkin: {$gte: 1490720400},
checkin: {$lte: 1490806799}
}]
}
为什么?
在第二个例子中,它完全忽略了第二个比较。
如果是这样,那么这个会发生什么?
$match:
{
$and:
[
{ checkin: {$gte: 1490979600}, checkout: {$lte: 1493569439} },
{ checkin: {$lt: 1490979600}, checkout: {$gt: 1493569439} },
{ checkin: {$lt: 1490979600}, checkout: {$gt: 1490979600} },
{ checkin: {$lt: 1493569439}, checkout: {$gt: 1493569439} }
]
}
那会是一样的吗?它看第一个并忽略了接下来的三个?
有没有办法避免这种情况?
答案 0 :(得分:2)
鉴于Ex:1
$match: {
$and:
[{
status: {$lt: 4},
checkin: {$gte: 1490720400, $lte: 1490806799}
}]
}
在这个例子中,字段名称没有歧义,所以工作正常
鉴于Ex:2
$match: {
$and:
[{
status: {$lt: 4},
checkin: {$gte: 1490720400},
checkin: {$lte: 1490806799}
}]
}
这里有一个模糊的归档" checkin"所以," checkin"将被下一个" checkin"覆盖在构造对象时(取决于哪一个将被覆盖,通常首先将被第二个替换)
要使其正常工作,您需要使用如下所示
$match:
{
$and:
[
{status: {$lt: 4}},
{checkin: {$gte: 1493569438} },
{checkin: {$lte: 1493569440}}
]
}
}
或者您可以在给出Ex:1
中使用鉴于Ex:3
$match:
{
$and:
[
{ checkin: {$gte: 1490979600}, checkout: {$lte: 1493569439} },
{ checkin: {$lt: 1490979600}, checkout: {$gt: 1493569439} },
{ checkin: {$lt: 1490979600}, checkout: {$gt: 1490979600} },
{ checkin: {$lt: 1493569439}, checkout: {$gt: 1493569439} }
]
}
将正常工作,即它将检查$和
中的所有4个条件答案 1 :(得分:1)
{
status: {$lt: 4},
checkin: {$gte: 1490720400},
checkin: {$lte: 1490806799}
}
是JSON文档的错误语法。字段名称应该是唯一的。您声明checkin
两次,这使得它不明确,并且由解析器决定如何解决它。例如。在mongodb shell中,后面的值会覆盖前者:
printjson({
status: {$lt: 4},
checkin: {$gte: 1490720400},
checkin: {$lte: 1490806799}
});
的结果
{
"status" : {
"$lt" : 4
},
"checkin" : {
"$lte" : 1490806799
}
}