javascript - 如何在嵌套子文档mongodb中查找带有数组的字段?

标签 javascript node.js mongodb mongoose restify

我正在尝试为文档中的嵌入式数组检索一些查找数据。

这是一个数据示例:

{
      "_id": "58a4fa0e24180825b05e14e9",
      "fullname": "Test User",
      "username": "testuser"
      "teamInfo": {
          "challenges": [
              {
                  "levelId": "5e14e958a4fa0",
                  "title": "test challenge 1.1"
              },
              {
                  "levelId": "5e14e958a4fa0",
                  "title": "test challenge 1.2"
              },
              {
                  "levelId": "5e14e958a4fa1",
                  "title": "test challenge 2.1"
              }
          ]
      }
}

如您所见,teamInfo.challenges 是一个数组,包含 levelId 字段。它们指向另一个名为 levels 的集合中的 _id 字段。

但是我该怎么做才能得到这样的 json 响应呢?

{
      "_id": "58a4fa0e24180825b05e14e9",
      "fullname": "Test User",
      "username": "testuser"
      "teamInfo": {
          "challenges": [
              {
                  "levelInfo": {
                      "name": "Level 1"
                  },
                  "title": "test challenge 1.1"
              },
              {
                  "levelInfo": {
                      "name": "Level 1"
                  },
                  "title": "test challenge 1.2"
              },
              {
                  "levelInfo": {
                      "name": "Level 2"
                  },
                  "title": "test challenge 2.1"
              }
          ]
      }
}

我正在尝试使用 unwind、project 和 group。但是我很困惑。

const user = await User.aggregate([
                {
                    $match: {_id: new mongoose.Types.ObjectId(req.user.userId)}
                },
                {
                    $lookup: {
                        from: 'levels',
                        localField: 'teamInfo.challenges.levelId',
                        foreignField: '_id',
                        as: 'challLevelInfo'
                    }
                },
                {
                    $group: {
                        _id: "$_id",
                        ........IM CONFUSED HERE........
                    }
                }
]);

最佳答案

您可以使用查找管道来处理嵌套查找

const pipeline = [
   {
     $match: {_id: new mongoose.Types.ObjectId(req.user.userId)}
   },
   {
     $lookup: {
       from: 'levels',
       let: { level_id: "$teamInfo.challenges.levelId" },
       pipeline: [
         {
           $match: {
             $expr: {
               $eq: ["$_id", "$$level_id"]
             }
           }
         },
         {
           $lookup: {
             from: '<level collection>',
             localField: "levelId",
             foreignField: "_id",
             as: "levelInfo"
           }
         },
         {
           $project: {
             levelInfo: {
               name: "$levelInfo.name"
             }
             title: 1
           }
         }
       ],
       as: "challenges"
     },

   },
   { $project: {
     _id: 1,
     fullname: 1,
     username: 1,
     teamInfo: {
       challenges: "$challenges"
     }
   }}
]

const result = await User.Aggregate(pipeline)

希望对您有所帮助!

关于javascript - 如何在嵌套子文档mongodb中查找带有数组的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56019324/

相关文章:

mysql - 使用导出与动态数据库node.js连接

javascript - GraphQL Args 错误 : argument type must be Input Type but got: function GraphQLObjectType(config) {

javascript - 检查 dom 对象大小调整的最高效方法

javascript - 如何向对象数组中插入/添加对象?

javascript - jqModal 不工作

javascript - 排序和处理推文的最佳方式 - Twitter API

javascript - 如何在 hapi.js 路由处理程序中将 mongodb 信息返回到浏览器?

node.js - 使用 Mongoose 在 Node js中连接多个mongo db数据库

javascript - Meteor:将 RegExp 对象保存到 session

javascript - 如何自动生成域和范围?有人知道为什么我的数据没有显示吗?