MongoDB - Aggregation - 在数组中获取唯一的项目。

问题描述 投票:10回答:3

这是我的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很陌生,我尝试了不同的聚合功能,但似乎都没有用。请大家帮忙。

mongodb mongodb-php mongodb-query
3个回答
17
投票

经过几次尝试,我解决了这个问题。下面是命令。

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
投票

在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"] },
          },
        },
      },
    },
  },
]);

0
投票

我不知道你们都试过什么聚合函数,但我想unwind会帮助你们做同样的事情,假设你们不能把它做完,我们有一个map-reduce会让你们轻松地做这一个。你可以看一下 http:/docs.mongodb.orgmanualapplicationsmap-reduce。 . 它允许你以你想要的方式获得数据,你可以很容易地获得列表。我认为$unwind在tags列上,然后$group他们将总是给我们不同的tags列表,按照你的要求在1和2的情况下创建$group在两个关键类别和项目,这是$unwind早期。

© www.soinside.com 2019 - 2024. All rights reserved.