计算从 mongodb 中的嵌套引用数组的查找查询中获取的元素数
Count number of elements to get from lookup query for nested referenced array in mongodb
我有以下类别collection
{
"_id" : ObjectId("5e1d8c3ed06661d2b06a7c46"),
"status" : "active",
"noOfLevels" : 3,
"levels" : [
ObjectId("5e1db2237a265cfe50dfdb18"),
ObjectId("5e1db22b7a265cfe50dfdb19"),
ObjectId("5e1db23b7a265cfe50dfdb1a")
],
"name" : "Fuel",
},
{
"_id" : ObjectId("5e1d8c3ed06661d2b06a7c46"),
"status" : "active",
"noOfLevels" : 3,
"levels" : [
ObjectId("5e1db2237a265cfe50dfdb18"),
ObjectId("5e1db22b7a265cfe50dfdb19"),
ObjectId("5e1db23b7a265cfe50dfdb1a")
],
"name" : "Feeds",
}
在上面的 collection 个关卡中,_id 已被存储为稍后填充的参考。
级别collection有这个项目:-
{
levelName: { type: String, required: true },
levelDesc: { type: String },
levelNo: { type: Number, required: true },
categoryId: { type: Mongoose.Schema.Types.ObjectId, ref: 'trainingCategories', required: true },
videoId: [{ type: Mongoose.Schema.Types.ObjectId, ref: 'trainingVideoMaster' }],
},
{
levelName: { type: String, required: true },
levelDesc: { type: String },
levelNo: { type: Number, required: true },
categoryId: { type: Mongoose.Schema.Types.ObjectId, ref: 'trainingCategories', required: true },
videoId: [{ type: Mongoose.Schema.Types.ObjectId, ref: 'trainingVideoMaster' }],
}
我正在使用聚合和查找来查找类别 collection 中的项目,在我的最终结果中,我需要对出现在特定类别的每个级别上的 videoId 进行计数。
需要这样的最终结果:-
{
name: 'How to save fuel',
catNo: 1,
noOfLevels: 3,
totalVideos: 4
},
{
name: 'Feeds',
catNo: 2,
noOfLevels: 3,
totalVideos: 3
}
您需要$unwind
trainingLevels
数组使其成为对象 属性 然后您可以使用 .dot
符号来获取 videoId
长度.
Cat.aggregate([
{ "$match": { "status": "active" } },
{ "$lookup": {
"from": "traininglevels",
"let": { "levels": "$levels" },
"pipeline": [
{ "$match": { "$expr": { "$in": ["$_id", "$$levels"] }}},
{ "$group": {
"_id": null,
"totalVideos": { "$sum": { "$size": "$videoId" }}
}}
]
"as": "trainingLevels"
}},
{ "$unwind": "$trainingLevels" },
{ "$project": {
"noOfLevels": 1,
"name": 1,
"catNo": 1,
"createdAt": 1,
"trainingLevels": "$trainingLevels.totalVideos"
}}
])
我有以下类别collection
{
"_id" : ObjectId("5e1d8c3ed06661d2b06a7c46"),
"status" : "active",
"noOfLevels" : 3,
"levels" : [
ObjectId("5e1db2237a265cfe50dfdb18"),
ObjectId("5e1db22b7a265cfe50dfdb19"),
ObjectId("5e1db23b7a265cfe50dfdb1a")
],
"name" : "Fuel",
},
{
"_id" : ObjectId("5e1d8c3ed06661d2b06a7c46"),
"status" : "active",
"noOfLevels" : 3,
"levels" : [
ObjectId("5e1db2237a265cfe50dfdb18"),
ObjectId("5e1db22b7a265cfe50dfdb19"),
ObjectId("5e1db23b7a265cfe50dfdb1a")
],
"name" : "Feeds",
}
在上面的 collection 个关卡中,_id 已被存储为稍后填充的参考。
级别collection有这个项目:-
{
levelName: { type: String, required: true },
levelDesc: { type: String },
levelNo: { type: Number, required: true },
categoryId: { type: Mongoose.Schema.Types.ObjectId, ref: 'trainingCategories', required: true },
videoId: [{ type: Mongoose.Schema.Types.ObjectId, ref: 'trainingVideoMaster' }],
},
{
levelName: { type: String, required: true },
levelDesc: { type: String },
levelNo: { type: Number, required: true },
categoryId: { type: Mongoose.Schema.Types.ObjectId, ref: 'trainingCategories', required: true },
videoId: [{ type: Mongoose.Schema.Types.ObjectId, ref: 'trainingVideoMaster' }],
}
我正在使用聚合和查找来查找类别 collection 中的项目,在我的最终结果中,我需要对出现在特定类别的每个级别上的 videoId 进行计数。
需要这样的最终结果:-
{
name: 'How to save fuel',
catNo: 1,
noOfLevels: 3,
totalVideos: 4
},
{
name: 'Feeds',
catNo: 2,
noOfLevels: 3,
totalVideos: 3
}
您需要$unwind
trainingLevels
数组使其成为对象 属性 然后您可以使用 .dot
符号来获取 videoId
长度.
Cat.aggregate([
{ "$match": { "status": "active" } },
{ "$lookup": {
"from": "traininglevels",
"let": { "levels": "$levels" },
"pipeline": [
{ "$match": { "$expr": { "$in": ["$_id", "$$levels"] }}},
{ "$group": {
"_id": null,
"totalVideos": { "$sum": { "$size": "$videoId" }}
}}
]
"as": "trainingLevels"
}},
{ "$unwind": "$trainingLevels" },
{ "$project": {
"noOfLevels": 1,
"name": 1,
"catNo": 1,
"createdAt": 1,
"trainingLevels": "$trainingLevels.totalVideos"
}}
])