我有这样的数据集

{
   "_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"
    ]
}


因此,在此数组存储字符串。现在,我想对整个数据集进行计算,“ ug的值”重复了几次。例如:在我的数据库查询之后,所需的结果将是

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


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

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


仅当找到任何字符串时,此查询才返回数据。
请指导我我做错了什么。任何帮助将不胜感激。

最佳答案

您是自己完成的,换句话说,您已经超出了所需的结果。只需使用以下查询即可获得所需的结果

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上使用升序,排序结果为

{ "_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 }



  有什么办法可以将我的子弹值添加到自定义字段,而不是
  在_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 }

07-26 01:18