我的文档有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);
});
});
我哪里错了?
答案 0 :(得分:1)
它返回一个空结果,因为您的第一个管道步骤是 $group
管道操作,它实际上是按categories
数组对您集合中的所有文档进行分组,同时你在这个特殊的组中添加一个数组类型的数组。将 $unwind
运算符应用于不存在的数组字段时,会出现空结果(因为之前的 $group
运算符管道不会生成一个新的categories
字段,只有密钥_id
和name
)。
您首先想要展平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);
});
});