MongoDB数组中的布尔聚合

时间:2017-12-13 09:23:30

标签: arrays mongodb boolean

我有一个JSON文档,如下所示

[
{a: "v1",b: "v2",c: "v3",d: [{k1: true},{k2: true},{k3: false}]},
{a: "v1",b: "v2",c: "v7",d: [{k1: false},{k2: true},{k3: false}]},
{a: "v8",b: "v9",c: "v3",d: [{k1: false},{k2: true},{k3: true},{k4: false}]},
{a: "v5",b: "v2",c: "v10",d: [{k1: false},{k2: true},{k3: false}]}
]

我想编写如下所示的查询:

select d from the above docs
where a = v1
and b = v2

预期结果将遵循两个文件:

{a: "v1",b: "v2",c: "v3",d: [{k1: true},{k2: true},{k3: false}]},
{a: "v1",b: "v2",c: "v7",d: [{k1: false},{k2: true},{k3: false}]}

到目前为止,它很容易。下面的查询将为您提供结果:

db.audit.find({a:"v1", b:"v2"},{d:1,_id:0}).pretty()

问题 -

现在要求在检索到的文档中进行布尔运算。 " OR"布尔运算应该是在" d"的数组元素的子文档中找到的各个键(k1,k2,k3等)的值。键。

如果某个密钥不存在,则假定它为假。

是否可以在MongoDB中执行此操作?

通过将d赋值给变量然后进行比较,可以很容易地编程,但我试图找到MongoDB是否可以直接执行。

提前致谢。

由于 AURO

1 个答案:

答案 0 :(得分:0)

在mongodb 3.6中你可以做到这一点

db.bool.aggregate(
    [
        {
            $match: {
               a:"v1", b:"v2"
            }
        },
        {
           $project:{
             d:{
              $map:{
                input:"$d",
                as:"do",
                in:{$arrayElemAt:[{$objectToArray:"$$do"},0]}
              }
             }
           }
        },
        {
          $unwind:"$d"
        },
        {
         $replaceRoot:{
          newRoot:"$d"
         }
        },
        {
          $group:{
            _id:"$k",res:{$addToSet:"$v"}
          }
        },
        {
         $project:{
          k:"$_id",
          v:{$or:"$res"},
          _id:0
         }
        },
        {
          $group:{
            _id:null,
            res:{$push:"$$ROOT"}
          }
        },
        {
        $project:{ _id:0,
         res:{$arrayToObject :"$res"}
        }
        }



    ]
);