Node.js 如何在mongodb中的对象数组中进行搜索

Node.js 如何在mongodb中的对象数组中进行搜索,node.js,mongodb,mongoose,mongodb-query,Node.js,Mongodb,Mongoose,Mongodb Query,假设mongodb文档(表)“users”是 { “_id”:“6065923bc5d509071857f6e6”, “版本”:[ { “名称”:“1.1.0”, “状态”:“未批准”, “_id”:“606592b1c5d509071857f6e7”, “文件”:[ { “_id”:“606592b3c5d509071857f6e8”, “url”:”https://google.com/1.png", “状态”:“等待” }, { “_id”:“606592b8c5d509071857f6

假设mongodb文档(表)“users”是

{
“_id”:“6065923bc5d509071857f6e6”,
“版本”:[
{
“名称”:“1.1.0”,
“状态”:“未批准”,
“_id”:“606592b1c5d509071857f6e7”,
“文件”:[
{
“_id”:“606592b3c5d509071857f6e8”,
“url”:”https://google.com/1.png",
“状态”:“等待”
},
{
“_id”:“606592b8c5d509071857f6e9”,
“url”:”https://google.com/2.png",
“状态”:“等待”
}
]
}
]

}
假设您要搜索集合
用户的
等待
状态

db.users.find({"version.files.status":"awaiting"}).pretty()
它将在数组中自动搜索

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

确保在
find
查询中有索引:

对于上面的例子

db.users.createIndex({"version.files._id":1},{background:true})
网站上还有更多的例子


编辑

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

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" },
    ],
  }
);

假设您要搜索集合
用户的
等待
状态

db.users.find({"version.files.status":"awaiting"}).pretty()
它将在数组中自动搜索

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

确保在
find
查询中有索引:

对于上面的例子

db.users.createIndex({"version.files._id":1},{background:true})
网站上还有更多的例子


编辑

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

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" },
    ],
  }
);

您可以这样做:

    await db.collection('users').updateOne(
        { _id: users._id },
        { $set: { "version.$[version].files.$[file].url": "newStatus" } },
        {
            arrayFilters: [
                { "version._id": "606592b1c5d509071857f6e7" },
                { "url": "https://google.com/1.png" }
            ]
        }
    );
编辑:

如果有多条记录带有
“https://google.com/1.png“
它将更新遇到的第一条记录的状态

编辑2:
感谢Mathieu Lescaudron纠正了我的错误

您可以这样做:

    await db.collection('users').updateOne(
        { _id: users._id },
        { $set: { "version.$[version].files.$[file].url": "newStatus" } },
        {
            arrayFilters: [
                { "version._id": "606592b1c5d509071857f6e7" },
                { "url": "https://google.com/1.png" }
            ]
        }
    );
编辑:

如果有多条记录带有
“https://google.com/1.png“
它将更新遇到的第一条记录的状态

编辑2:
感谢Mathieu Lescaudron修复了我的错误

我们可以使用findOneAndUpdate()吗?当然,只需将updateOne替换为findOneAndUpdate,然后使用
returnNewDocument:true
布尔值返回更新后的文档(与ArrayFilter一起)就可以了。。但是,当我更新文件的“状态”时,在这种情况下,“状态”没有更新,我使用的是这个{$set:{“版本”。$[version].files.$[file].status:data.status,“version.$[version].files.$[file].url”:data.url},Yes,您需要在$set对象中提供所有要更新的字段您需要添加
returnNewDocument:true
以及我们可以使用findOneAndUpdate()吗?当然,只需将updateOne替换为findOneAndUpdate,并使用
returnNewDocument:true
布尔值返回更新后的文档(与ArrayFilter一起)Yes working。。但是,当我更新文件的“状态”时,在这种情况下,“状态”没有更新,我使用的是这个{$set:{“版本”。$[version].files.$[file].status:data.status,“version.$[version].files.$[file].url”:data.url},Yes,您需要在$set对象中提供所有要更新的字段,您还需要添加
returnNewDocument:true