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】:位置运算符 ($
) 只能用于一级嵌套数组。在您的情况下,您必须为alarms
和eventJoiners
指定条件。为此,您可以使用 $[< 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" ])
在这种情况下,标识符elem1
和elem2
用作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 - 基于嵌套数组的字段值更新数组对象中的字段