我在mongodb中很陌生,所以这是我的问题,我想要的是检查主文档是否存在,然后检查是否存在,检查嵌套文档是否存在,然后更新它,以及是否不插入新文档。但是使用此代码,我只能更新一个现有的嵌套文档,而不能创建一个新的嵌套文档。我什至不知道这种方法是否正确使用,是否有效?
collection.find_one_and_update(
{"_id:{"field1":val1,"field2":val2,"field3":val3,"field4":val4}},
{"$set":{"elements.$[element].prop2":valToUpdate}},
return_document=ReturnDocument.AFTER,
array_filters=[{"element.prop1":valToCheck}],
upsert=True
)
在mongo语法中,我认为是这样的:
db.collection.findOneAndUpdate(
{"_id:{"field1":val1,"field2":val2,"field3":val3,"field4":val4}},
{"$set":{"elements.$[element].prop2":valToUpdate}},
{ arrayFilters: [ {"element.prop1":valToCheck} ] }
)
我是否可以使用像这样的一个函数来完成整个过程(检查主文档和嵌套文档是否存在以及是否更新,否则创建一个新函数)?
我要如何更改文档的示例:
在执行方法之前
{
"_id":{"name":"Storename","location":"somewhere","phone":46284723},
"books":
[
{"name":"somebook","price":{"$numberDouble":"34"}}
]
}
执行后是否有嵌套文档
{
"_id":{"name":"Storename","location":"somewhere","phone":46284723},
"books":
[
{"name":"somebook","price":{"$numberDouble":"55"}},
]
}
执行后,如果没有嵌套的文档
{
"_id":{"name":"Storename","location":"somewhere","phone":46284723},
"books":
[
{"name":"somebook","price":{"$numberDouble":"34"}},
{"name":"someOTHERbook","price":{"$numberDouble":"45"}}
]
}
那是因为upsert
似乎不能与$
运算符一起使用,而且一般来说,upsert在文档级别,但是不应该用于插入缺少数组的元素,例如这种情况。由于实际文档存在于数据库中,因此将出现重复错误_id
。
如果要在一个数据库调用中执行此操作,则以下查询应适用于您的方案,因为在任何给定情况下,只有一个updateOne
应更新数组:
Mongo查询:
db.yourCollectionName.bulkWrite([
{
updateOne: {
filter: {
"_id": {
"name": "Storename",
"location": "somewhere",
"phone": 46284723
}, 'books.name': 'somebook'
}, update: {
$set: { "books.$.price": 100 }
}
}
},
{
updateOne: {
filter: {
"_id": {
"name": "Storename",
"location": "somewhere",
"phone": 46284723,
}
}, update: {
$addToSet: { 'books': { 'name': 'somebook', "price": 100 } }
}
}
}])
Python代码:
import pymongo
from pymongo import UpdateOne
bulkArr = [
UpdateOne({
"_id": {
"name": "Storename",
"location": "somewhere",
"phone": 46284723
}, 'books.name': 'somebook'
}, { '$set': { "books.$.price": 100 } }),
UpdateOne({
"_id": {
"name": "Storename",
"location": "somewhere",
"phone": 46284723,
}
}, {
$addToSet: { 'books': { 'name': 'somebook', "price": 100 } }
})
]
db.yourCollectionName.bulk_write(bulkArr)
PyMongo参考:请确实参考此链接来转换此查询。PyMongo-bulk_write
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句