【发布时间】:2017-12-10 05:21:10
【问题描述】:
当我执行以下聚合时
return this.aggregate([
{
$lookup: {
from: 'groups',
localField: '_group',
foreignField: '_id',
as: 'group'
}
},
{ $match: query },
{
$project: {
group: {
$let:{
vars:{
firstGroup:{
$arrayElemAt:["$group",0]
}
},
in:{
name:"$$firstGroup.name",
description:"$$firstGroup.description"
}
}
},
name: 1,
description: 1,
_id: 0
}
},
{ $sort: sortBy },
{ $limit: resultsPerPage },
{ $skip: skipDocuments }
])
查询 = {} 没有限制没有跳过 我得到了 8 个按 group.name 分组的匹配角色
ROLES: [
{"name":"NewRole","description":"NewRole description","group":{}},{"name":"Visitor","description":"no permissions","group":{}},
{"name":"NewRoleInGroup","description":"NewRoleInGroup description","group":{"name":"GroupA","description":"Description GroupA"}},
{"name":"admin","description":"can RW group, user","group":{"name":"GroupA","description":"Description GroupA"}},
{"name":"employee","description":"can R group, can read user","group":{"name":"GroupA","description":"Description GroupA"}},
{"name":"manager","description":"can R group, can RW user","group":{"name":"GroupA","description":"Description GroupA"}},
{"name":"employee","description":"can R group, can read user","group":{"name":"GroupB","description":"Description GroupB"}},
{"name":"manager","description":"can R group, can RW user","group":{"name":"GroupB","description":"Description GroupB"}},
{"name":"employee","description":"can R group, can read user","group":{"name":"GroupC","description":"Description GroupC"}}
]
现在我想将匹配的文档总数作为结果中的第一个对象插入以跟踪它(当在聚合中指定限制时,我应该返回文档总数)
ROLES: [
{"roleCount": 8},
{"name":"NewRole","description":"NewRole description","group":{}},{"name":"Visitor","description":"no permissions","group":{}},
{"name":"NewRoleInGroup","description":"NewRoleInGroup description","group":{"name":"GroupA","description":"Description GroupA"}},
{"name":"admin","description":"can RW group, user","group":{"name":"GroupA","description":"Description GroupA"}},
{"name":"employee","description":"can R group, can read user","group":{"name":"GroupA","description":"Description GroupA"}}
]
我应该在管道中的哪里写计数(我猜是在 $match 之后?) 以及如何将计数插入结果中? (我猜是在 $sort 之后?)
也许没有办法在一个聚合中做到这一点,唯一的可能性是首先执行一个集合计数然后聚合并在返回结果之前插入计数器对象(使用 Promise.all 它可以并行完成。 .)
感谢反馈
【问题讨论】:
标签: node.js mongoose aggregation-framework