mongodb中对象嵌套数组的聚合查询
我有以下收藏。每个文件可表示为以下内容。每个文档可以有多个客户推荐人mongodb中对象嵌套数组的聚合查询,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我有以下收藏。每个文件可表示为以下内容。每个文档可以有多个客户推荐人 { _id:objectId(""), customerId: "Some Id", name: "Customer name", customerReferee: [ { status: 'COMPLETED', name: "Referee name1" }, { status:
{
_id:objectId(""),
customerId: "Some Id",
name: "Customer name",
customerReferee: [
{
status: 'COMPLETED',
name: "Referee name1"
},
{
status: 'PENDING',
name: "Referee name2"
},
],
}
我希望拥有最多“已完成”客户引用数量的前20个文档。
状态条件$match
迭代$filter
数组的循环,并按customerReferee
状态进行过滤
获取上述筛选结果中的元素总数$size
按总计元素排序,我们已按降序添加了一个字段$sort
customerRefereeSize
从0开始光标$skip
获取前20个元素$limit
您的问题不清楚,20份文件中“已完成”的最大数量=>描述了“已完成”的最大数量意味着多少?可以有任意数量的已完成的裁判。我想以降序排列文件,其中完成的裁判数最多的文件将是第一个,随后是比第一个裁判数较少的文件。我要这类文件的前20份@turivishal谢谢@turivishal。它在操场上工作,但在我的数据库中抛出“无法识别的管道阶段名称:'$set'”,“代码”:40324,'此错误。原因可能是什么?我不确定,但请尝试
$addFields
而不是$set
,让我知道它是否工作。感谢更新。现在错误消失了,工作正常。✌
db.collection.aggregate([
{ $match: { "customerReferee.status": "COMPLETED" } },
{
$addFields: {
customerRefereeSize: {
$size: {
$filter: {
input: "$customerReferee",
cond: { $eq: ["$$this.status", "COMPLETED"] }
}
}
}
}
},
{ $sort: { customerRefereeSize: -1 } },
{ $skip: 0 },
{ $limit: 20 }
])