MongoDB-聚合-获取数组中的唯一项
这是我的MongoDB收藏:MongoDB-聚合-获取数组中的唯一项,mongodb,mongodb-php,mongodb-query,Mongodb,Mongodb Php,Mongodb Query,这是我的MongoDB收藏: { "_id" : ObjectId("515d8f53175b8ecb053425c2"), "category" : "Batteries", "products" : [ { "brand" : "Duracell", "item" : [ "AA", "AAA" ] }
{
"_id" : ObjectId("515d8f53175b8ecb053425c2"),
"category" : "Batteries",
"products" : [
{
"brand" : "Duracell",
"item" : [
"AA",
"AAA"
]
},
{
"brand" : "Everyday",
"item" : [
"9V",
"AA",
"12V"
]
}
]
}
我需要的输出是
1) 所有项目的唯一列表
{["AA", "AAA", "9V", "12V"]}
及
2.每个产品的唯一项目列表
{
"category" : "Batteries",
"item": ["AA", "AAA", "9V", "12V"]
}
我对MongoDB非常陌生,我尝试了不同的聚合函数,但似乎没有任何效果。请帮忙 我不确定您在聚合函数中尝试了什么,但我认为“展开”将帮助您完成同样的操作,假设您无法完成,我们有一个map reduce,它将允许您轻松完成此操作。你可以调查一下。它允许您以您想要的方式获取数据,并且您可以轻松地获取列表。我认为,标签栏上的$unwind和$group始终会根据您在1中的要求为我们提供不同标签的列表,对于第2种情况,请在两个关键类别和项目上创建$group,这两个类别和项目之前是$unwind。经过几次尝试,我已经解决了这个问题。以下是命令:
db.xyz.aggregate( {$project: {a: '$products.item'}},
{$unwind: '$a'},
{$unwind: '$a'},
{$group: {_id: 'a', items: {$addToSet: '$a'}}});
及
在mongodb3.4之后,有一个
$reduce
操作符,因此我们可以在不增加额外阶段的情况下平整阵列
一,
col.aggregate([
{
$项目:{
项目:{
美元减少:{
输入:“$products.items”,
初始值:[],
在:{$concatarray:[“$$value”、“$$this”]},
},
},
},
},
{$unwind:“$items”},
{$group:{u id:null,items:{$addToSet:“$items”}},
]);
二,
col.aggregate([
{
$项目:{
类别:1,,
项目:{
$setUnion:{
美元减少:{
输入:“$products.items”,
初始值:[],
在:{$concatarray:[“$$value”、“$$this”]},
},
},
},
},
},
]);
我知道这是个老问题,你几年前就解决了!但是,您标记为正确的答案中有一个小问题,它可能不适用于所有情况。$unwind
是一个昂贵的操作员,可能会影响大型数据集的延迟和内存消耗。我认为在这种情况下,$reduce
操作符的性能更好。Devesh,感谢您的回复。我能够用聚合来解决这个问题。我也发布了我的答案。为什么要两次展开$呢?因为'item'嵌套在一个数组中。
db.xyz.aggregate( {$project: {category: 1, a: '$products.item'}},
{$unwind: '$a'},
{$unwind: '$a'},
{$group: {_id: '$category', items: {$addToSet: '$a'}}});