我有一个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
答案 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"}
}
}
]
);