数组mongodb上出现的值的次数

时间:2017-11-22 06:54:47

标签: node.js mongodb

我有这样的数据集

{
   "_id" : ObjectId("5a1414430b4215041c768f50"),
   "slug" : [ 
      "a", "b", "c"
   ]
},
{
    "_id" : ObjectId("5a1414430b4215041c768f51"),
    "slug" : [ 
        "a", "d", "e"
    ]
},
{
    "_id" : ObjectId("5a1414430b4215041c768f52"),
    "slug" : [ 
        "b", "b", "f"
    ]
},
{
    "_id" : ObjectId("5a1414430b4215041c768f53"),
    "slug" : [ 
        "g", "h", "b"
    ]
}

所以在这里,数组存储字符串。现在我想计算整个数据集,slug的值重复了多少次。例如:在我的数据库查询之后,所需的结果将类似于

a = 2, b = 4, c = 1, d = 1, e = 1, f = 1, g = 1, h = 1

我正在使用Aggregation执行此类任务,但无法完全获得所需的结果。 我的查询是

Message.aggregate([
            {"$project": {"slug":1}},
            {"$unwind":"$slug"},
            {"$group": {"_id":{"_id":"$_id", "slug":"$slug"}, "count":{"$sum":1}}},
            {"$match": {"count":{"$gt":1}}},
            {"$group": {"_id": "$_id._id", "slug":{"$addToSet":"$_id.slug"}}}
        ]);

此查询仅在找到任何字符串时返回数据。 请指导我在哪里做错了。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

你自己完成了,换句话说,你已经越过了你需要的结果。只需使用以下查询即可获得所需的结果

db.Message.aggregate([
    {$unwind:"$slug"},
    {$group:{"_id":"$slug", "count":{"$sum":1}}}
]);

所示示例文档的结果如下所示

{ "_id" : "h", "count" : 1 }
{ "_id" : "g", "count" : 1 }
{ "_id" : "f", "count" : 1 }
{ "_id" : "e", "count" : 1 }
{ "_id" : "b", "count" : 4 }
{ "_id" : "d", "count" : 1 }
{ "_id" : "c", "count" : 1 }
{ "_id" : "a", "count" : 2 }

要以排序方式打印结果,请使用$ sort

db.Message.aggregate([
   {$unwind:"$slug"},
   {$group:{"_id":"$slug", "count":{"$sum":1}}},
   {$sort:{"_id":1}}
]);

我们在`_id'上使用升序,而Sorted结果是

{ "_id" : "a", "count" : 2 }
{ "_id" : "b", "count" : 4 }
{ "_id" : "c", "count" : 1 }
{ "_id" : "d", "count" : 1 }
{ "_id" : "e", "count" : 1 }
{ "_id" : "f", "count" : 1 }
{ "_id" : "g", "count" : 1 }
{ "_id" : "h", "count" : 1 }
  

是否有任何解决方案可以将我的slug值设置为自定义字段而不是   在_id下。与{ "slugname" : "a", "count" : 2 }代替{ "_id" : "a", "count" : 2 }

一样

这可以通过将$project添加到现有查询

来完成

_id:0 - 将其压制到下一阶段

slugname:“$ _ id” - 将_id的值添加到slugname

db.Message.aggregate([
    {$unwind:"$slug"}, 
    {$group:{"_id":"$slug", "count":{"$sum":1}}},
    {$sort:{"_id":1}}, 
    {$project: {_id:0, slugname :"$_id", count:"$count"}}
]);

最终结果

{ "slugname" : "a", "count" : 2 }
{ "slugname" : "b", "count" : 4 }
{ "slugname" : "c", "count" : 1 }
{ "slugname" : "d", "count" : 1 }
{ "slugname" : "e", "count" : 1 }
{ "slugname" : "f", "count" : 1 }
{ "slugname" : "g", "count" : 1 }
{ "slugname" : "h", "count" : 1 }