对多级子文档使用位置运算符[重复]

Posted

技术标签:

【中文标题】对多级子文档使用位置运算符[重复]【英文标题】:Using positional operator for multiple levels of subdocuments [duplicate] 【发布时间】:2017-01-12 01:54:45 【问题描述】:

我在 mongodb 中使用子文档。

使用一级子文档,我可以更新文档

Parent.findOneAndUpdate( _id: parentId, 'children._id': childId , 
  $set: 
    'children.$.name': name
  
, (err, doc) => 
  ...
);

但我对另一级别的子文档执行相同操作时遇到问题,即

Parent.findOneAndUpdate( _id: parentId, 'children._id': childId, 'children.grandchildren._id': grandchildId , 
  $set: 
    'children.$.grandchildren.$.name': name
  
, (err, doc) => 
  ...
);

位置运算符 ($) 是否仅限于 1 级子文档?

【问题讨论】:

【参考方案1】:

位置运算符 ($) 只支持一个级别,也支持第一个匹配元素。作为一种解决方法,您可以这样做,

$set: 'children.$.grandchildren.0.name': name

我觉得这个问题解释的比较清楚here

【讨论】:

哦。谢谢。但是,您的解决方法不是只采用孙子数组中的第一个对象,而不是与我的 grandchildId 匹配的对象吗? 是的,它会选择您提到的第一个对象。但是您可以使用 mongodb 的 foreach 函数并更新与grandchildId 匹配的每个孙子的名称。我提供的答案中的链接也有一个您可以参考的答案。 Here is the link for that answer 该功能已于2017年实现jira.mongodb.org/browse/SERVER-831

以上是关于对多级子文档使用位置运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Mongoose和MongoDB 2.6插入子文档中数组中的特定位置

如何在 MongoDB C# 驱动程序版本 2 中使用 $ 位置运算符

如何在 MongoDB C# 驱动程序版本 2 中使用 $ 位置运算符

Simulink:使用多级总线信号执行数学运算

用于算术运算的 MongoDB 聚合 - 子文档字段

带有 $sum 操作的 Mongodb 位置运算符“$”不起作用