这是我的MongoDB系列:
{
"_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的新手,我尝试了不同的聚合功能,似乎没什么用。请帮忙。
答案 0 :(得分:16)
经过几次尝试,我解决了这个问题。这是命令:
db.xyz.aggregate( {$project: {a: '$products.item'}},
{$unwind: '$a'},
{$unwind: '$a'},
{$group: {_id: 'a', items: {$addToSet: '$a'}}});
和
db.xyz.aggregate( {$project: {category: 1, a: '$products.item'}},
{$unwind: '$a'},
{$unwind: '$a'},
{$group: {_id: '$category', items: {$addToSet: '$a'}}});
答案 1 :(得分:3)
mongodb3.4之后,有一个$reduce
运算符,因此我们可以在不进行额外阶段的情况下平整数组。
1。
col.aggregate([
{
$project: {
items: {
$reduce: {
input: "$products.items",
initialValue: [],
in: { $concatArrays: ["$$value", "$$this"] },
},
},
},
},
{ $unwind: "$items" },
{ $group: { _id: null, items: { $addToSet: "$items" } } },
]);
2。
col.aggregate([
{
$project: {
category: 1,
items: {
$setUnion: {
$reduce: {
input: "$products.items",
initialValue: [],
in: { $concatArrays: ["$$value", "$$this"] },
},
},
},
},
},
]);
答案 2 :(得分:0)
我不确定你在聚合函数中尝试了什么,但我认为展开将帮助你做同样的事情,假设你无法完成它,我们有一个map-reduce,它将允许你很容易做到这一点。您可以查看http://docs.mongodb.org/manual/applications/map-reduce/。它允许您以您想要的方式获取数据,并且您可以轻松获取列表。我认为在“标签”列上展开$,然后$ group它们将始终向我们提供您在1中所需的不同标签列表,对于第二种情况,在两个关键类别和项目上创建$ group,这是前面的$ unwind。
答案 3 :(得分:0)
我知道这是一个古老的问题,几年前您已经解决了!但是您标记为正确的答案中有一个小问题,它可能并不适合所有情况。 $unwind
是一个昂贵的运算符,可能会影响大型数据集的延迟和内存消耗。我认为在这种情况下,$reduce
运算符的性能更高。