过滤掉Mongo聚合中$ lookup返回的文件

时间:2017-09-26 20:51:39

标签: mongodb mongoose aggregate

我正在运行此命令:

{ $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 }
    ]);

0 个答案:

没有答案