Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB-聚合-获取数组中的唯一项_Mongodb_Mongodb Php_Mongodb Query - Fatal编程技术网

MongoDB-聚合-获取数组中的唯一项

MongoDB-聚合-获取数组中的唯一项,mongodb,mongodb-php,mongodb-query,Mongodb,Mongodb Php,Mongodb Query,这是我的MongoDB收藏: { "_id" : ObjectId("515d8f53175b8ecb053425c2"), "category" : "Batteries", "products" : [ { "brand" : "Duracell", "item" : [ "AA", "AAA" ] }

这是我的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非常陌生,我尝试了不同的聚合函数,但似乎没有任何效果。请帮忙

我不确定您在聚合函数中尝试了什么,但我认为“展开”将帮助您完成同样的操作,假设您无法完成,我们有一个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'}}});