我有这样的数据集
{
"_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"}}}
]);
此查询仅在找到任何字符串时返回数据。 请指导我在哪里做错了。任何帮助将不胜感激。
答案 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 }