MongoDB更新对象值的嵌套对象[重复]

Posted

技术标签:

【中文标题】MongoDB更新对象值的嵌套对象[重复]【英文标题】:MongoDB Update nested object of objects value [duplicate] 【发布时间】:2018-11-07 06:45:21 【问题描述】:

我的格式是:


        "_id" : ObjectId("5af44cfbe2e96c58ec402efb"),
        "username" : "egealpay2",
        "email" : "egealpay2@gmail.com",
        "fullName" : "ege",
        "pnumber" : "",
        "oneSignal" : "d427dcdf-7939-4ada-a035-be74e1e45091",
        "friends" : [
                
                        "email" : "baransrc@gmail.com",
                        "status" : 2
                
        ],
        "alarms" : [
                
                        "id" : "2",
                        "title" : "before",
                        "location" : "default",
                        "startTime" : "2018-05-16\t\t\t16:29",
                        "endTime" : "16:29\t\t\t17 - 05 - 2018",
                        "remindAt" : "17:29\t\t\t15 - 05 - 2018",
                        "privacy" : "0",
                        "userORJoinedAlarm" : "1",
                        "eventJoiners" : [
                                
                                        "email" : "ilkersadya@sabanciuniv.edu",
                                        "status" : 1
                                ,
                                
                                        "email" : "ilkercankayasss@sabanciuniv.edu",
                                        "status" : 1
                                ,
                                
                                        "email" : "ilkearcankaya@sabanciuniv.edu",
                                        "status" : 1
                                ,
                                
                                        "email" : "iaaalkercankaya@sabanciuniv.edu",
                                        "status" : 1
                                
                        ],
                        "comments" : [ ]
                
        ]

我想设置status: 2 of "email" : "ilkersadya@sabanciuniv.edu", its under"alarms:" , "eventJoiners" :which has an id of 2 as"id"`

我尝试使用带有 $ 的推送,但无法使其正常工作,并且它一直困扰着我超过 2 小时。

感谢@Ashish,我已经尝试过更新:

 dbo.collection("users").findOne(  email: userId  , function(errZer, addedZer) 
          dbo.collection("users").findOneAndUpdate( email: addedID, "alarms.id": eventIDGiv,  alarms:  $elemMatch:  id: '2', eventJoiners:  $elemMatch:  email: addedID    ,
           $set:  "alarms.$.eventJoiners.$.status": '2'  , function(err, added) 

得到错误

(node:9334) UnhandledPromiseRejectionWarning: MongoError: Too many positional (i.e. '$') elements found in path 'alarms.$.eventJoiners.$.status'

【问题讨论】:

【参考方案1】:

位置运算符 ($) 只能用于一级嵌套数组。在您的情况下,您必须为alarmseventJoiners 指定条件。为此,您可以使用 $[< identifier >] 语法(在 MongoDB 3.6+ 中可用):

db.collection.update(
     _id: ObjectId("5af44cfbe2e96c58ec402efb") ,
     $set:  "alarms.$[elem1].eventJoiners.$[elem2].status": "2"  ,
     arrayFilters: [  "elem1.id": "2" ,  "elem2.email": "ilkersadya@sabanciuniv.edu"  ])

在这种情况下,标识符elem1elem2 用作arrayFilters 部分中指定条件的占位符。

【讨论】:

我得到:MongoError:不能使用部分(alarms of alarms.$[elem1].eventJoiners.$[elem2].status)来遍历元素(alarms:[id:“3 ", title: "可见 请注意我使用 node.js 进行调用 @CompuScie 你有哪个 MongoDB 版本? MongoDB 外壳版本:3.2.19 @CompuScie 你能升级吗?我问是因为就我而言,您不能在 3.6 以下的版本中更新超过一层的嵌套数组

以上是关于MongoDB更新对象值的嵌套对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有 elemMatch 的 MongoDB 查询,用于从对象内部匹配嵌套数组数据 [重复]

更新嵌套的 MongoDB 文档对象

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

搜索并将数组推送到MongoDB中的嵌套对象数组[重复]

如何在 mongodb/mongoose 的嵌套数组中检查是不是存在并更新对象?

更新 mongodb 中的嵌套数组