我正在运行此命令:
{ $lookup: { from: "views", localField: "checkedViews._id", foreignField: "id", as: "populatedViews" } },
不幸的是,这会返回每个上传文档中的所有views
文档,因此当我使用
$project
时
populatedViews: {
$size: "$populatedViews"
},
它等于每次上传的整个集合中的总观看量。我应该使用$filter
仅包含通过_id
匹配的文档,还是我该怎么做?
视频示例:
{
"_id" : ObjectId("59b5d09980348a3ec3541acc"),
"checkedViews" : [
ObjectId("59b5d0b280348a3ec3541acd"),
ObjectId("59b5d0bf80348a3ec3541ace"),
ObjectId("59b5d1dbd8f37d4ab797fa5c")
]
}
checkedView:
示例{
"_id" : ObjectId("59b5d0b280348a3ec3541acd"),
"updatedAt" : ISODate("2017-09-10T23:54:26.752Z"),
"createdAt" : ISODate("2017-09-10T23:54:26.752Z"),
"video" : ObjectId("59b5d09980348a3ec3541acc"),
"validity" : "real",
"__v" : 0
}
这是我到目前为止所拥有的:
const oldUploads = await Video.aggregate([
{ $match: {
visibility: { $ne: 'removed' },
'checkedViews.1' : { $exists: true }
}},
{ $lookup: { from: "views", localField: "checkedViews._id", foreignField: "id", as: "populatedViews" } },
{ $project: {
title: 1,
checkedViews: 1,
viewAmount: {
$size: {
$filter: {
input: "$populatedViews",
as: "view",
cond: { $eq: ['$$view.id', '$checkedView.id'] }
}
}
},
populatedViews: {
$size: "$populatedViews"
},
}
},
{
$sort: { viewAmount: -1 }
},
{ $skip: 1 },
{ $limit : 100 }
]);