首页 > 解决方案 > 如何在mongodb中的对象数组中搜索

问题描述

假设 mongodb 文档(表)“用户”是

{
    "_id": "6065923bc5d509071857f6e6",
    "version": [
        {
            "name": "1.1.0",
            "status": "not Approved",
            "_id": "606592b1c5d509071857f6e7",
            "files": [
                {
                    "_id": "606592b3c5d509071857f6e8",
                    "url": "https://google.com/1.png",
                    "status": "awaiting"
                },
                {
                    "_id": "606592b8c5d509071857f6e9",
                    "url": "https://google.com/2.png",
                    "status": "awaiting"
                }
            ]
        }
    ]
}

我想更新这个“*** https://google.com/1.png***”图片的状态 我们可以使用 findOneAndUpdate 吗?因为我想返回更新的对象

标签: node.jsmongodbmongoosemongodb-query

解决方案


假设您要搜索awaiting集合的状态users

db.users.find({"version.files.status":"awaiting"}).pretty()

它将自动在数组中搜索。

但是,更新有点不同,您应该使用arrayFilter

db.users.updateOne(
  {
    "version.files._id": "606592b3c5d509071857f6e8",
  },
  {
    $set: {
      "version.$[version].files.$[file].url": "something else",
    },
  },
  {
    arrayFilters: [
      { "version._id": "606592b1c5d509071857f6e7" },
      { "file._id": "606592b3c5d509071857f6e8" },
    ],
  }
);

确保在您的find查询上有一个索引:

对于上面的例子

db.users.createIndex({"version.files._id":1},{background:true})

Mongo Doc上提供了更多示例


编辑

根据您的评论,这是一个工作示例:

db.users.findOneAndUpdate(
  { "version.files._id": "606592b3c5d509071857f6e8" },
  {
    $set: {
      "version.$[version].files.$[file].url": "Test URL",
      "version.$[version].files.$[file].status": "Test status",
    },
  },
  {
    returnNewDocument: true,
    arrayFilters: [
      { "version._id": "606592b1c5d509071857f6e7" },
      { "file._id": "606592b3c5d509071857f6e8" },
    ],
  }
);

在此处输入图像描述


推荐阅读