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

Ana*_*nth 10 mongodb mongodb-php mongodb-query

这是我的MongoDB集合:

{
    "_id" : ObjectId("515d8f53175b8ecb053425c2"),
    "category" : "Batteries",
    "products" : [
        {
            "brand" : "Duracell",
            "item" : [
                "AA",
                "AAA"
            ]
        },
        {
            "brand" : "Everyday",
            "item" : [
                "9V",
                "AA",
                "12V"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我需要的输出是

1)所有项目的唯一列表

{["AA", "AAA", "9V", "12V"]}
Run Code Online (Sandbox Code Playgroud)

2.每个产品的唯一项目清单

{
    "category" : "Batteries",
    "item": ["AA", "AAA", "9V", "12V"]
}
Run Code Online (Sandbox Code Playgroud)

我是MongoDB的新手,我尝试了不同的聚合功能,似乎没什么用.请帮忙.

Ana*_*nth 16

经过几次尝试,我解决了这个问题.这是命令:

db.xyz.aggregate( {$project: {a: '$products.item'}}, 
    {$unwind: '$a'}, 
    {$unwind: '$a'}, 
    {$group: {_id: 'a', items: {$addToSet: '$a'}}});
Run Code Online (Sandbox Code Playgroud)

db.xyz.aggregate( {$project: {category: 1, a: '$products.item'}}, 
    {$unwind: '$a'}, 
    {$unwind: '$a'}, 
    {$group: {_id: '$category', items: {$addToSet: '$a'}}});
Run Code Online (Sandbox Code Playgroud)

  • 因为'item'嵌套在一个数组中. (7认同)
  • 你为什么要两次放松? (5认同)

Nat*_*let 5

在 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" } } },
]);
Run Code Online (Sandbox Code Playgroud)

2.

col.aggregate([
  {
    $project: {
      category: 1,
      items: {
        $setUnion: {
          $reduce: {
            input: "$products.items",
            initialValue: [],
            in: { $concatArrays: ["$$value", "$$this"] },
          },
        },
      },
    },
  },
]);
Run Code Online (Sandbox Code Playgroud)