按子文档 ID 查找并更新其数据
Posted
技术标签:
【中文标题】按子文档 ID 查找并更新其数据【英文标题】:Find by Sub Document Id and update its data 【发布时间】:2018-06-01 03:48:13 【问题描述】:通过多个 Id 按子文档查找并更新其数据。 下面的例子说通过grades.id查找数据并将其对应的平均值更新为100。
MongoDB 版本:3.4 和 3.6
按子文档 ID 更新子文档 - 子文档 ID 数组
架构:
"_id" : 1,
"grades" : [
"id" : 1,
"grade" : 80,
"mean" : 75,
"std" : 6
,
"id" : 2,
"grade" : 85,
"mean" : 90,
"std" : 4
,
"id" : 3,
"grade" : 85,
"mean" : 85,
"std" : 6
]
查询:
db.students.update(
_id: 1,
$set: "grades.$[elem].mean" : 100 ,
multi: true,
arrayFilters: [ "elem._id": $in: [1, 2] ]
)
输出
"_id" : 1,
"grades" : [
"id" : 1,
"grade" : 100,
"mean" : 75,
"std" : 6
,
"id" : 2,
"grade" : 100,
"mean" : 90,
"std" : 4
,
"id" : 3,
"grade" : 85,
"mean" : 85,
"std" : 6
]
上面的查询我试过了,但是失败了
错误 不能使用部分(grades of grades.$[elem].mean)来遍历元素
【问题讨论】:
【参考方案1】:无法对 v3.4 运行此查询,因为它根本不支持这个新的数组过滤功能。因此,您必须针对 v3.6 运行查询。
然后你可能会遇到以下两个问题:
您的arrayFilters: [ "elem._id": $in: [1, 2] ]
应引用正确的字段名称,仅"elem.id"
(不带下划线)。
您可能正在使用 Robomongo(或类似的)作为客户端来运行您的查询。我不完全知道这里发生了什么,但这根本行不通。使用 Mongo shell 后,一切都会按预期工作。
【讨论】:
mongoose 是否支持 arrayFilters 这个问题也请参考 继续上面的问题***.com/questions/47881328/arrayfilter-in-mongoose以上是关于按子文档 ID 查找并更新其数据的主要内容,如果未能解决你的问题,请参考以下文章