如何在MongDB中将嵌套文档更新或插入到数组中

esteban21

我在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在elasticsearch中更新数组内的嵌套文档

如何在javascript中将多个函数插入到数组中

如何在 JavaFx 中将数组插入到 TableView 中?

如何在 JQuery 中将多个元素插入到数组中?

在 lambda 中使用 python 将数组值插入到 mongdb 中的单独文档中?

如何在Firestore中的嵌套文档中更新嵌套文档?

如何从嵌套文档数组中删除/更新

Mgo如何在嵌套数组中查找嵌套文档?

如何在嵌套数组中更新一个文档

如何在 SQLite 中将元素插入到数组(json)的中间?

如何在java中将一行插入到二维数组中?

如何更新嵌套在文档中的数组中的特定项目

如何更新 MongoDB 文档中的特定嵌套数组

如何将数组插入到嵌套的 JavaScript 对象中

Pymongo:如何在文档中插入多个字段的数组?

如何在MongoDB中查找并插入子文档数组列表?

如何在数组中返回嵌套文档

如何在python中将元素插入到多个列表中?

将新项目插入到集合的所有文档中以嵌套数组

如何在javascript中将数组中的数组foreach到表

MongoDB:如何在嵌套数组中插入对象?

ElasticSearch:更新数组中的嵌套文档

在MongoDB中更新嵌套数组文档

多个嵌套文档中的MongoDB更新数组

在找到的文档猫鼬中更新或推送对象到嵌套数组中

如何在MongoDB中更新嵌套数组中的数据

如何在MSSQL中更新JSON中的嵌套数组

如何在mongdb中自定义数组

Mongoose 更新嵌套文档数组中嵌套对象中的值