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

标签 mongodb mongodb-query aggregation-framework

假设我有 2 个收藏

// 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"
  }
]

我如何使用聚合发出请求,该请求将使用元素的动态 _id 显示此输出? 如果“posts.voted”中没有与当前帖子关联的元素,则在第二个 $match 中使用帖子的当前 _id 并将“myvote”设置为 0 时遇到问题。

这是我尝试过的: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

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

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

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

关于mongodb - 如何在第二个$match中使用当前字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71017475/

相关文章:

javascript - 返回特定的mongodb嵌入文档

java - MongoDB 插入和更新字段

mongodb - $在 mongodb 中查找多个级别

javascript - JQuery 更改背景图像恢复为旧图像

node.js - 闭包查找node.js、mongodb、express

MongoDB 在包含 50.000.000 个文档的大型集合上写入性能不佳

MongoDB。查找元素数组具有所需元素的所有文档

javascript - 可以比较 mongodb 中的日期字符串吗?

java - mongodb 3 java : aggregation sum of keys

mongodb - 如何使用 mongoexport 导出排序数据?