根据mongodb中的子文档字段分组
我在mongodb集合中存储了以下文档:根据mongodb中的子文档字段分组,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我在mongodb集合中存储了以下文档: { "_id" : ObjectId("5b56d4072eb1102f495c11ab"), "currentStage" : ObjectId("5b06999d889de3bd613ab79d"), "stagePermissions" : [ { "_id" : ObjectId("5b55a8cd8bb066994dc21314"), "status" : "A
{
"_id" : ObjectId("5b56d4072eb1102f495c11ab"),
"currentStage" : ObjectId("5b06999d889de3bd613ab79d"),
"stagePermissions" : [
{
"_id" : ObjectId("5b55a8cd8bb066994dc21314"),
"status" : "AWAITING_REVIEW",
"stage" : ObjectId("5b06999d889de3bd613ab79d"),
},
{
"_id" : ObjectId("5b55a8cd8bb066994dc21354"),
"status" : "IN_PROGRESS",
"stage" : ObjectId("5b06999d889de3bd613ac79d"),
}
]
}
我想按stagePermissions.status
获取文档计数,其中stagePermissions.stage
等于currentStage
Expected OutPut:
[
{_id: IN_PROGRESS, count: 1},
{_id: AWAITING_REVIEW, count: 1}
]
您可以在3.6版本中使用以下聚合
只考虑至少有一个许可阶段与当前阶段权限匹配的文档。
展开阶段权限并筛选与当前阶段权限匹配的所有权限 阶段权限状态,后跟以计数权限db.col.aggregate([
{"$match":{"$expr":{"$in":["$currentStage","$stagePermissions.stage"]}}},
{"$unwind":"$stagePermissions"},
{"$match":{"$expr":{"$eq":["$currentStage","$stagePermissions.stage"]}}},
{"$group":{"_id":"$stagePermissions.status","count":{"$sum":1}}}
])
3.4更新
输出阶段权限阶段与当前阶段相同的子文档
使用筛选器输出覆盖阶段权限数组
查询将返回所有参与者文档,其中的用户子文档的年龄与参与者的年龄相同
db.col.aggregate([
{"$addFields":{"stagePermissions":{"$filter":{"input":"$stagePermissions","cond":{"$eq":["$$this.stage","$currentStage"]}}}}},
{"$unwind":"$stagePermissions"},
{"$group":{"_id":"$stagePermissions.status","count":{"$sum":1}}}
])
更新: 对于Mongo 3.4,您可以使用此聚合查询,因为只有在Mongo 3.6中才引入了
$expr
:
db.test.aggregate([
{ $unwind : "$stagePermissions"},
{$project: {_id : 1, currentStage : 1, stagePermissions : 1, value : {$cmp: ['$currentStage','$stagePermissions.stage']}}},
{$match: { value : {$eq:0}}},
{ $group :
{
_id : "$stagePermissions.status",
count : {$sum : 1}
}
}
])
在这里,我们使用$cmp
运算符首先获取比较值,然后使用$match
运算符查找那些性质相同的文档
=========================================================================
输入文件:
{
"_id" : ObjectId("5b56d4072eb1102f495c11ab"),
"currentStage" : ObjectId("5b06999d889de3bd613ab79d"),
"stagePermissions" : [
{
"_id" : ObjectId("5b55a8cd8bb066994dc21314"),
"status" : "AWAITING_REVIEW",
"stage" : ObjectId("5b06999d889de3bd613ab79d")
},
{
"_id" : ObjectId("5b55a8cd8bb066994dc21354"),
"status" : "IN_PROGRESS",
"stage" : ObjectId("5b06999d889de3bd613ab79d")
}
]
}
聚合查询:
db.test.aggregate([
{ $unwind : "$stagePermissions"},
{ $match : {$expr : {$eq : ["$currentStage", "$stagePermissions.stage" ]}}},
{ $group :
{
_id : "$stagePermissions.status",
count : {$sum : 1}
}
}
])
输出:
{ "_id" : "IN_PROGRESS", "count" : 1 }
{ "_id" : "AWAITING_REVIEW", "count" : 1 }
您使用的是哪个版本的Mongo?版本3.4.10更新了答案。请尝试并让我知道!你能升级到3.6吗?如果你不能,我可以添加3.4投诉解决方案。不,我无法升级,如果你能提供解决方案,那就太棒了。谢谢