nar*_*uto 6 mongodb mongodb-query
{
_id:'1',
name:'apple',
option:[{
weight:'10',
price:'40',
},
{weight:'40',
price:'200'}]
}
Run Code Online (Sandbox Code Playgroud)
我要添加苹果(如果不在db中),如果要在db中添加,如果重量10可用,我要确认,如果可用,我要更新价格,否则,我想添加新的重量和价格。在mongodb中,我该怎么做。
你想要.bulkWrite()这个。这实际上不是单个操作,因此您希望在单个请求中提交多个操作。$set本质上是尝试在数据存在的地方写入更新或$push在数据不存在的地方写入新数据:
db.collection.bulkWrite([
{ "updateOne": {
"filter": { "_id": "1", "option.weight": "10" },
"update": {
"$set": { "option.$.price": "30" }
}
}},
{ "updateOne": {
"filter": { "_id": "1", "option.weight": { "$ne": "10" } },
"update": {
"$push": { "option": { "weight": "10", "price": "30" } }
}
}}
])
Run Code Online (Sandbox Code Playgroud)
积极的情况只是值,而$ne“否定”相等匹配,意味着该项目不存在。当然,位置$运算符$set与它所在的位置一起使用
给定数据后,尽管“批量”发送了两个操作,但只有其中一个操作实际上会匹配并作为更新应用。
如果您还想对整个文档进行“更新插入”,那么您需要在其末尾添加另一个操作。请注意,您不能将“upsert”作为任何其他语句的选项,特别是$ne因为这会创建一个不存在数组项的新文档,而不仅仅是_id:
db.collection.bulkWrite([
{ "updateOne": {
"filter": { "_id": "1", "option.weight": "10" },
"update": {
"$set": { "option.$.price": "30" }
}
}},
{ "updateOne": {
"filter": { "_id": "1", "option.weight": { "$ne": "10" } },
"update": {
"$push": { "option": { "weight": "10", "price": "30" } }
}
}},
{ "updateOne": {
"filter": { "_id": 1 },
"update": {
"$setOnInsert": {
"option": [
{ "weight": "10", "price": "30" }
]
}
},
"upsert": true
}}
])
Run Code Online (Sandbox Code Playgroud)
这$setOnInsert是这里的主要帮助,除了最后一个操作是唯一标记为 的"upsert"。这种组合确保在找到主“文档”的地方实际上不会发生任何事情,但是当找不到它时,就会添加新的数组项。
作为旁注,我强烈建议将数值实际上存储为数字而不是字符串。在大多数情况下,它不仅可以节省空间,而且更有用。
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |