在所有文档中填充基于数组的字段中唯一项的计数

时间:2016-06-15 07:22:21

标签: mongodb sails.js

我的文档有category字段作为字符串数组,例如

{ name: "aaa", categories: ["apple","banana","peach"] },
{ name: "bbb", categories: ["apple","orange" },
{ name: "ccc", categories: ["apple","peach"] }
...

结果我需要拥有一个对象数组,这些对象具有此类别的类别和出现次数的每个唯一值的聚合值,如下所示:

[
    { category: "apple", qty: 3 },
    { category: "banana", qty: 1 },
    { category: "peach", qty: 2 },
    { category: "orange", qty: 1 }
]

我尝试过以下操作,但它在结果

中生成空数组
SomeCollection.native(function(err, collection) {
    collection.aggregate([
        { $group: { _id: "$categories", name: { $addToSet: "$categories._type" } } },
        { $unwind: "$categories" },
        { $group : { _id : "$categories", count: { $sum : 1 } } }
    ], function(error, result) {
        sails.log.info('result:', result);  
    });
});

我哪里错了?

1 个答案:

答案 0 :(得分:1)

它返回一个空结果,因为您的第一个管道步骤是 $group 管道操作,它实际上是按categories数组对您集合中的所有文档进行分组,同时你在这个特殊的组中添加一个数组类型的数组。将 $unwind 运算符应用于不存在的数组字段时,会出现空结果(因为之前的 $group 运算符管道不会生成一个新的categories字段,只有密钥_idname)。

您首先想要展平categories数组,以便为​​类别数据字段的每个元素生成一条新记录, $unwind < / strong>已应用。现在,您可以应用 $group 操作来获得所需的结果:

考虑以下方法:

SomeCollection.native(function(err, collection) {
    collection.aggregate([
        { $unwind: "$categories" },
        { $group: { _id: "$categories", qty: { $sum : 1 } } }
    ], function(error, result) {
        sails.log.info('result:', result);  
    });
});