我正在尝试执行一个由两个$or人组成的查询:
|--------------------
| Date1 | Date2 |
|--------------------
| NULL | NULL | *
| NULL | TODAY | *
| NULL | TOMRW |
| TODAY | TODAY | *
| TODAY | NULL | *
| TOMRW | NULL |
|--------------------
Run Code Online (Sandbox Code Playgroud)
(我已经标记了与星号相匹配的行)
(Date1 == null || Date1 <= today) && (Date2 == null || Date2 <= today)
Run Code Online (Sandbox Code Playgroud)
我不确定如何在MongoDB中表达此查询.
它可以分解为两个单独的查询,完全按照它们的要求:
{
"$or": [{
"Date1": {
"$exists": false
}
},
{
"Date1": {
"$exists": true,
"$lte": new Date("2012-01-07T04:45:52.057Z")
}
}]
}
Run Code Online (Sandbox Code Playgroud)
和
{
"$or": [{
"Date2": {
"$exists": false
}
},
{
"Date2": {
"$exists": true,
"$lte": new Date("2012-01-07T04:45:52.057Z")
}
}]
}
Run Code Online (Sandbox Code Playgroud)
这两个都选择了正确的文档集 - 我只是不知道如何将它们作为单个查询执行.
我最初的想法是做一个像这样的查询:
{
$and: [orQuery1, orQuery2]
}
Run Code Online (Sandbox Code Playgroud)
使用$and查询返回0结果.在此线程中解释了为什么:$和query不返回任何结果
同样在该线程中,建议进行如下查询:
{
Key: {valToMatch1: 1, valToMatch2: 2}
}
Run Code Online (Sandbox Code Playgroud)
但我不认为$or可以这样执行.
所以,问题是:我如何构造我的查询,以便我可以将两个$或者组合成一个查询?
(它变得很晚,所以我希望这个问题有道理.)
use test
db.test.insert({a:1})
db.test.insert({a:2, Date2:new Date("01/07/2012")})
db.test.insert({a:3, Date2:new Date("01/08/2012")})
db.test.insert({a:4, Date1:new Date("01/07/2012"), Date2:new Date("01/07/2012")})
db.test.insert({a:5, Date1:new Date("01/07/2012")})
db.test.insert({a:6, Date1:new Date("01/08/2012")})
Run Code Online (Sandbox Code Playgroud)
第一个子查询db.test.distinct('a',{...});
[1,2,3]
第二个子查询db.test.distinct('a',{...});
[1,5,6]
(Date1 == null || Date1 <= today) && (Date2 == null || Date2 <= today)
Run Code Online (Sandbox Code Playgroud)
放松
Date1 == null && Date2 == null ||
Date1 == null && Date2 <= today ||
Date1 <= today && Date2 == null ||
Date1 <= today && Date2 <= today ||
Run Code Online (Sandbox Code Playgroud)
询问
db.test.find(
{
$or :
[
{$and: [
{"Date1": {"$exists": false}},
{"Date2": {"$exists": false}}
]},
{$and: [
{"Date1": {"$exists": false}},
{"Date2": {
"$exists": true,
"$lte": new Date("2012-01-07T04:45:52.057Z")}
}
]},
{$and: [
{"Date2": {"$exists": false}},
{"Date1": {
"$exists": true,
"$lte": new Date("2012-01-07T04:45:52.057Z")}
}
]},
{$and: [
{"Date2": {
"$exists": true,
"$lte": new Date("2012-01-07T04:45:52.057Z")}
},
{"Date1": {
"$exists": true,
"$lte": new Date("2012-01-07T04:45:52.057Z")}
}
]}
]
})
>[ 1 ]
Run Code Online (Sandbox Code Playgroud)
这也应该工作(假设'不存在'和'null'是相同的)
db.test.find(
{
$and :
[
{$or: [
{"Date1": null},
{"Date1": { "$lte": new Date("2012-01-07T04:45:52.057Z")} }
]},
{$or: [
{"Date2": null},
{"Date2": { "$lte": new Date("2012-01-07T04:45:52.057Z")} }
]}
]
}
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7397 次 |
| 最近记录: |