MongoDB按名称对数组中的项进行计数
我有这样的文件:MongoDB按名称对数组中的项进行计数,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有这样的文件: { "_id" : ObjectId("5b3ced158735f1196d73a743"), "cid" : 1, "foo" : [ { "k" : "sport", "v" : "climbing" }, { "k" : "sport", "v" : "soccer" },
{
"_id" : ObjectId("5b3ced158735f1196d73a743"),
"cid" : 1,
"foo" : [
{
"k" : "sport",
"v" : "climbing"
},
{
"k" : "sport",
"v" : "soccer"
},
{
"k" : "sport",
"v" : "soccer"
}
]
}
此查询只返回包含足球场的文档
db.coll.find({foo:{$elemMatch:{ v: "soccer"}} }, {"foo.$" : 1,cid:1})
返回:
{ "_id" : ObjectId("5b3ced158735f1196d73a743"), "cid" : 1, "node" : [ { "k" : "sport", "v" : "climbing" } ] }
但我想知道,每个返回的文档中有多少个足球元素。我怎么能数呢 您可以使用下面的查询和筛选的数组来计算匹配出现的次数
db.coll.aggregate([
{"$project":{
"cid":1,
"count":{
"$size":{
"$filter":{
"input":"$foo",
"cond":{"$eq":["$$this.v","soccer"]
}
}
}
}
}}
])
我只是想知道我是否明白你的问题。你期望产出:2?我说的对吗?是的,cid和count。有很多这样的文件。我需要例如:{cid:1,count:4},{cid:3,count:2}很酷,但是我如何才能返回count>0的字段呢?您可以在项目之后添加匹配阶段。类似于
{“$match”:{“count”:{“$gt”:0}}}
非常感谢:+1:
db.coll.aggregate(
// Pipeline
[
// Stage 1
{
$match: {
foo: {
$elemMatch: {
v: 'soccer'
}
}
}
},
// Stage 2
{
$unwind: {
path: '$foo'
}
},
// Stage 3
{
$project: {
cid: 1,
count: {
$cond: {
if: {
$eq: ['$foo.v', 'soccer']
},
then: {
$sum: 1
},
else: 0
}
}
}
},
// Stage 4
{
$group: {
_id: '$cid',
total_count: {
$sum: '$count'
}
}
}
]
);