如何在第二个 $match 中使用当前字段?

How to use current field in second $match?

假设我有 2 个 collections

// Post collection:
[
    {
      "_id": "somepost1",
      "author": "firstuser",
      "title": "First post"
    },
    {
      "_id": "somepost2",
      "author": "firstuser",
      "title": "Second post"
    },
    {
      "_id": "somepost3",
      "author": "firstuser",
      "title": "Third post"
    }
]
// User collection:

[
    {
      "_id": "firstuser",
      "nickname": "John",
      "posts": {
        "voted": []
      }
    },
    {
      "_id": "seconduser",
      "nickname": "Bob",
      "posts": {
        "voted": [
          {
            "_id": "somepost1",
            "vote": "1"
          },
          {
            "_id": "somepost3",
            "vote": "-1"
          }
        ]
      }
    }
  ]

我需要得到这个结果:

[
  {
    "_id": "somepost1",
    "author": {
      "_id": "firstuser",
      "nickname": "John"
    },
    "title": "First post",
    "myvote": "1"
  },
  {
    "_id": "somepost2",
    "author": {
      "_id": "firstuser",
      "nickname": "John"
    },
    "title": "Second post",
    "voted": "0"
  },
  {
    "_id": "somepost3",
    "author": {
      "_id": "firstuser",
      "nickname": "John"
    },
    "title": "Third post",
    "myvote": "-1"
  }
]

如何使用 聚合 发出请求,这将显示带有元素的 dynamic _id 的输出? 我在 second $match 中使用 current _id of post 时遇到问题,如果其中没有元素,则将“myvote”设置为 0 “posts.voted”与当前 post.

关联

这是我尝试过的:https://mongoplayground.net/p/v70ZUioVSpQ

db.post.aggregate([
  {
    $match: {
      author: "firstuser"
    }
  },
  {
    $lookup: {
      from: "user",
      localField: "author",
      foreignField: "_id",
      as: "author"
    }
  },
  {
    $addFields: {
      author: {
        $arrayElemAt: [
          "$author",
          0
        ]
      }
    }
  },
  {
    $lookup: {
      from: "user",
      localField: "_id",
      foreignField: "posts.voted._id",
      as: "Results"
    }
  },
  {
    $unwind: "$Results"
  },
  {
    $unwind: "$Results.posts.voted"
  },
  {
    $match: {
      "Results.posts.voted._id": "ID OF CURRENT POST"
    }
  },
  {
    $project: {
      _id: 1,
      author: {
        _id: 1,
        nickname: 1
      },
      title: 1,
      myvote: "$Results.posts.voted.vote"
    }
  }
])

来自$match docs

The query syntax is identical to the read operation query syntax

查询语法不允许使用文档值。这就是你想要做的。

我们可以做的是在 $match 阶段使用 $expr,这允许我们使用聚合运算符,从而也可以访问文档值。像这样:

{
    $match: {
        $expr: {
            $eq: ['$Results.posts.voted._id', '$_id'],
        }
    },
},