{
_id:'1',
name:'apple',
option:[{
weight:'10',
price:'40',
},
{weight:'40',
price:'200'}]
}
我想添加苹果,如果它不在数据库,如果它在数据库中,我想ckeck如果重量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" } }
}
}}
])
正面的情况只是值,而$ne
“否定”相等匹配,意味着该项目不存在.当然positional $
operator与$set
一起使用
在给定数据的情况下,尽管在“批次”中发送了两个操作,但是其中一个操作实际上将匹配并应用为更新.
如果你想要整个文档的“upserts”,那么你需要在其末尾添加另一个操作.请注意,您不能将“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
}}
])
$setOnInsert
是主要的帮助,除了最后一个操作是唯一标记为“upsert”.该组合确保找到主要“文档”的位置,然后实际上没有发生任何事情,但是当找不到时,会添加新的数组项.
作为旁注,我强烈建议将数值实际存储为数字而不是字符串.在大多数情况下,它不仅可以节省空间,而且在这方面也更有用.