Node.js 如何在mongodb中的对象数组中进行搜索
假设mongodb文档(表)“users”是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
{
“_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