结合两个$或语句

Bry*_*isi 12 mongodb

我正在尝试执行一个由两个$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可以这样执行.

所以,问题是:我如何构造我的查询,以便我可以将两个$或者组合成一个查询?

(它变得很晚,所以我希望这个问题有道理.)

Rad*_*dik 9

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)