2016-09-15 42 views
0

我正在使用带mongodb的loopback js。 我有一个产品集合,如:我如何获得每个标签的产品数

{ 
    name:'prod 1', 
    tags:['tag1','tag3'] 
}, 
{ 
    name:'prod 2', 
    tags:['tag2'] 
}, 
{ 
    name:'prod 3', 
    tags:['tag2','tag3'] 
} 

我需要找到通过标签分组的产品数量,像 预期结果:

{ 
    tag1 : 1, 
    tag2 : 2, 
    tag3 : 2 
} 

我试图做到这一点,如:

productCollection.aggregate(
         {$match: { 
          is_available: true 
         } }, 
         {$unwind:"$tags"}, 
         { $group : { 
          _id:"$tags", 
          "products" : { "$sum" : 1 } 
          } 
         },function(err,totals){}); 

但上面的分组是基于整个tags属性而不是每个单独的标签。我错过了什么?我是否需要放松并投影?

+0

你目前的o/p是什么? – notionquest

+0

您的查询已在产生预期结果。我不明白你为什么说它没有产生预期的结果。查询在下面的答案中也没有改变。 – notionquest

+0

[使用mongo跨所有文档计数数组的次数的重复次数](http://stackoverflow.com/questions/34089056/count-array-occurrences-across-all-documents-with-mongo) – styvane

回答

0

那么有几种方法可以得到您想要的结果。但是,如果您期待精确的文档格式,请在mongo shell中尝试。

var obj = {}; 

db.collection.aggregate([ 
    {$unwind:"$tags"}, 
    {$group:{_id:"$tags", count:{$sum:1}}} 
]).forEach(function(doc){ 
    obj[doc._id] = doc.count; 
}); 

printjson(obj); 

这应该发射。

{ 
    "tag1" : NumberInt(1), 
    "tag3" : NumberInt(2), 
    "tag2" : NumberInt(2) 
} 

希望能给你一些指导。

相关问题