node.js - 如何在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 吗?因为我想返回更新的对象
解决方案
假设您要搜索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" },
],
}
);
推荐阅读
- php - 如果条件满足,则回显变量
- oracle-apex - 在 Oracle APEX 中管理用户
- powerbi - 如何将计算列添加到将忽略切片器 Power BI 中的选定值的现有表
- python - Endswith 和 Replacement 语法 - Pandas
- c - 在 C 中生成“分段错误(核心转储)”错误消息的素数程序
- swift - 调用 writeValue 后 CBPeripheral 与 UnknownError Code=0 断开连接
- node.js - 播种 MongoDB nodejs
- php - 如何在 laravel 中以欧洲格式显示日期
- java - 无法获取 SequenceInformation 并且在 ResultSet 中找不到列 start_with
- javascript - 从 Amazon SQS 获取特定消息