我有这样的数据集
{
"_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 }