mongodb查询更新选择嵌套字段

Posted

技术标签:

【中文标题】mongodb查询更新选择嵌套字段【英文标题】:mongodb query update select nested fields 【发布时间】:2019-09-25 20:29:42 【问题描述】:

这是我在 mongo 中的文档:

"calendar": 
        "_id": "5cd26a886458720f7a66a3b8",
        "hotel": "5cd02fe495be1a4f48150447",
        "calendar": [
            
                "_id": "5cd26a886458720f7a66a413",
                "date": "1970-01-01T00:00:00.001Z",
                "rooms": [
                    
                        "_id": "5cd26a886458720f7a66a415",
                        "room": "5cd17d82ca56fe43e24ae5d3",
                        "price": "",
                        "remaining": 0,
                        "reserved": 0
                    ,
                    
                        "_id": "5cd26a886458720f7a66a414",
                        "room": "5cd17db6ca56fe43e24ae5d4",
                        "price": "",
                        "remaining": 0,
                        "reserved": 0
                    
                ]
            ,
   

我需要更新内部房间数组中的对象。我尝试了一个选择匹配元素的查询,没有语法错误,但出现错误:

"errmsg" : "字段 'calendar.0.rooms.0.price' 必须是一个数组,但是 在文档 _id: 中属于字符串类型: ObjectId('5cd26a886458720f7a66a3b8')",

这是我的查询:

db.calendars.updateOne(_id:ObjectId("5cd26a886458720f7a66a3b8"), 
 "calendar":"$elemMatch":"_id":ObjectId("5cd26a886458720f7a66a413"),"rooms._id":
 ObjectId("5cd26a886458720f7a66a415"), 
"$push":"calendar.$[outer].rooms.$[inner].price":"100000", "arrayFilters":["outer._id":ObjectId("5cd26a886458720f7a66a413"),"inner._id":ObjectId("5cd26a886458720f7a66a415")])

这是我在 *** 中找到的一些参考资料,但没有帮助: Updating a Nested Array with MongoDB

【问题讨论】:

如果你得到了答案,那么要么将其标记为重复,要么自己回答。 不,我没有得到答案。我找到了一些查询,但它不起作用。 【参考方案1】:

您可以使用以下查询

db.getCollection("test").updateOne(
  
    "_id": ObjectId("5cd26a886458720f7a66a3b8"),
    "calendar.calendar": 
      "$elemMatch": 
        "_id": ObjectId("5cd26a886458720f7a66a413"),
        "rooms._id": ObjectId("5cd26a886458720f7a66a415")
      
    
  ,
   "$set":  "calendar.calendar.$[outer].rooms.$[inner].price": "100000"  ,
  
    "arrayFilters": [
       "outer._id": ObjectId("5cd26a886458720f7a66a413") ,
       "inner._id": ObjectId("5cd26a886458720f7a66a415") 
    ]
  
)

之后我会用一些解释来更新我的答案

【讨论】:

以上是关于mongodb查询更新选择嵌套字段的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB - 基于嵌套数组的字段值更新数组对象中的字段

Mongodb嵌套文档的修改-利用数组修改器更新数据

MongoDB——MongoDB安装+增删改查操作

MongoDB——MongoDB安装+增删改查操作

MongoDB 查询技巧(1) - 字段相等

MongoDB数据库增删改查基本使用