如何查找对象数组并仍然保留对象属性?

尤尔帕莱

这是mongodb Playground中的代码

我有一个查询,如下所示:

    db.posts.aggregate({
      $lookup: {
        from: "users",
        let: {comments: "$comments"},
        pipeline: [
          {$match: {$expr: {$in: ["$_id", "$$comments.userId"]} }},
          {"$addFields":{"text": "$$comments.text"}}
        ],
        as: "comments"
      }
    })

此查询的问题在于,text我得到值是一个包含来自all的文本的数组comments如果我尝试按过滤userId,则会遇到另一个问题。如果用户评论不止一次,则该text值将是一个包含其所有的数组comments

如何获得一个对象中的查找用户及其评论?

编辑

我期望结果如下所示:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "id": "1",
    "comments": [
      {
        "_id": "u1",
        "name": "James",
        "username": "jamo",
        "text": "Hi there, who are you?"
      },
      {
        "_id": "u1",
        "name": "James",
        "username": "jamo",
        "text": "Hi! Are you still there?"
      }
    ],
  }
]
土生的
  • $unwind解构comments数组
  • $lookup 加入用户集合,
  • $unwind 得到...的对象 user
  • $group通过_idcomments用必填字段进行重构
db.posts.aggregate([
  { $unwind: "$comments" },
  {
    $lookup: {
      from: "users",
      localField: "comments.userId",
      foreignField: "_id",
      as: "comments.user"
    }
  },
  { $unwind: "$comments.user" },
  {
    $group: {
      _id: "$_id",
      id: { $first: "$id" },
      comments: {
        $push: {
          _id: "$comments._id",
          text: "$comments.text",
          username: "$comments.user.username",
          name: "$comments.user.name"
        }
      }
    }
  }
])

操场


第二种选择,不带$unwind

  • $lookupusers收藏
  • $map迭代comments数组循环
  • $filter迭代users数组的外观并找到匹配的用户信息
  • $arrayElemAt 从$ filter返回已过滤用户的第一个对象
  • $mergeObjects 将合并评论对象和用户信息
db.posts.aggregate([
  {
    $lookup: {
      from: "users",
      localField: "comments.userId",
      foreignField: "_id",
      as: "users"
    }
  },
  {
    $project: {
      comments: {
        $map: {
          input: "$comments",
          as: "c",
          in: {
            $mergeObjects: [
              "$$c",
              {
                $arrayElemAt: [
                  {
                    $filter: {
                      input: "$users",
                      cond: { $eq: ["$$c.userId", "$$this._id"] }
                    }
                  },
                  0
                ]
              }
            ]
          }
        }
      }
    }
  }
])

操场

我尚未测试两个查询的性能,请尝试并使用合适的查询

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何查找对象数组的类型

来自分类Dev

反向查找对象与数组

来自分类Dev

查找对象数组的索引

来自分类Dev

如何通过对象数组中的id查找对象?

来自分类Dev

如何通过对象数组中的id查找对象?

来自分类Dev

如何使用lodash在嵌套的对象数组中查找对象?

来自分类Dev

通过嵌套数组中的match属性查找对象

来自分类Dev

在具有相同value属性的数组中查找对象

来自分类Dev

在对象数组内部查找对象

来自分类Dev

如何通过列表中的属性值获取/查找对象

来自分类Dev

如何按属性在python列表中查找对象

来自分类Dev

如何从ReactJS setState查找对象数组的长度?

来自分类Dev

猫鼬如何在数组中查找对象

来自分类Dev

如何在仅具有“子”数组的一个已标识属性的数组中查找对象的ID

来自分类Dev

通过反射递归查找对象属性?

来自分类Dev

通过反射递归查找对象属性?

来自分类Dev

查找对象属性(反射)的困难

来自分类Dev

PHP OOP按属性查找对象

来自分类Dev

在JSON文件中查找对象属性

来自分类Dev

查找对象和数组之间的交集

来自分类Dev

了解在数组中查找对象

来自分类Dev

Lodash 嵌套查找对象到数组

来自分类Dev

在数组中查找对象

来自分类Dev

在数组上查找对象的索引

来自分类Dev

iOS:在属性x等于对象y的数组中查找对象

来自分类Dev

当对象属性位于数组中时,使用猫鼬删除或查找对象

来自分类Dev

在Javascript中,如何在满足某些条件的同时在具有最高特定属性值的数组中查找对象

来自分类Dev

如何使用lodash在内部数组包含其他对象的数组中查找对象

来自分类Dev

查找对象参考

Related 相关文章

热门标签

归档