比较嵌套数组中的对象-mongoDB

比较嵌套数组中的对象-mongoDB,mongodb,mongodb-query,aggregation-framework,redash,Mongodb,Mongodb Query,Aggregation Framework,Redash,在my db中,每个包含项的文档中都有一个嵌套的元素数组,格式如下: elements:[ { "elem_id": 12, items: [ {"i_id": 1, "type": x}, {"i_id": 2, "type": y}, {"i_id": 3, "type": x}] }, {

在my db中,每个包含项的文档中都有一个嵌套的元素数组,格式如下:

elements:[
     {
      "elem_id": 12,
      items: [ {"i_id": 1, "type": x}, {"i_id": 2, "type": y}, {"i_id": 3, "type": x}]
     },
     {
      "elem_id": 13,
      items: [ {"i_id": 4, "type": x}, {"i_id": 5, "type": x}]
     }
]
我试图返回所有具有不同类型项的元素,这意味着我只能返回:

     {
      "elem_id": 12,
      items: [ {"i_id": 1, "type": x}, {"i_id": 2, "type": y}, {"i_id": 3, "type": x}]
      }
因为存在类型为x和类型为y的项目

我想我需要迭代items数组,并将数组中每个项的类型与前面项的类型进行比较,但我不知道如何在聚合中做到这一点

请注意,我使用的是Redash,因此我不能在查询中包含任何JS

谢谢你的帮助

试试这个:

db.elements.aggregate([
{$unwind:“$elements”},
{
$addFields:{
“计数”:{$size:$elements.items”},
“独特价值”:{
美元减少:{
输入:“$elements.items”,
初始值:[{$arrayElemAt:[“$elements.items.type”,0]}],
在:{
$setUnion:[“$$value”,[“$$this.type”]]
}
}
}
}
},
{
$match:{
$expr:{
$eq:[“$count”,{$size:$uniqueValues”}]
}
}
}
]);
输出:

{
“_id”:ObjectId(“603f8f05bcee43720bcea”),
“要素”:{
“元素id”:12,
“项目”:[
{
“i_id”:1,
“类型”:1
},
{
“i_id”:2,
“类型”:2
},
{
“i_id”:3,
“类型”:3
}
]
},
“计数”:3,
“唯一值”:[1,2,3]
}

元素id:12的
数组的
项的最后一个
项必须是
“type”:z
对吗?实际上它是type:x,因为我只想检查至少有两个唯一键,而不是所有键都是唯一的。但是你的答案非常有用-我只需要在[{$size:“uniqueValues”},2]上使用$gt就可以得到我想要的东西。谢谢