Mongoose:更新特定文档数组的元素

Posted

技术标签:

【中文标题】Mongoose:更新特定文档数组的元素【英文标题】:Mongoose: update an element of an array of a specific document 【发布时间】:2018-12-14 17:55:17 【问题描述】:

我有一个名为“公司”的文档集合。

公司 1 -

 
  _id: '1',
  data:[
    _id:'11', value: 'emp11',
    _id:'12', value: 'emp12'
  ]

公司 2-

  
  _id: '2',
  data:[
    _id:'21', value: 'emp21',
    _id:'22', value: 'emp22'
  ]

现在我想将值“emp11”更新为“emp99”。 我正在遵循这种方法-

companyModel.findById('1', function(err, company) 
    return company.data.update(
        _id: '11',
        $set: value: 'emp99'
    );
);

我可以找到公司,但之后它显示错误-

company.data.update is not a function

请提出一个可能的解决方案。

【问题讨论】:

【参考方案1】:
companyModel.update(
   "_id" : :"1", "data._id": "11" , 
   "$set":  "data.$.value": "emp99" , 
  function(err, company) 
    console.log(company)
)

没有需要使用findById,直接使用即可。 在 mongo update 中,您需要同时搜索要更新的文档和字段。 您要更新的字段是必不可少的,因为它用于在您使用 $ 时定位数组的位置。

但是你也可以这样做:

companyModel.findById('1', function(err, company) 
    for(var i =0; i< company.data.length; i++)
        if(company.data._id === "11")
            break;
    if(i<company.data.length)
        company.data[i].value = 'emp99'
    company.save()
);

【讨论】:

太棒了……!它工作......非常感谢。您能否建议在哪里了解除官方文档之外的 mongoose 查询。 我用过很多mongodb,经验丰富,文档非常好。 MongoDB 文档提供了有助于学习的示例。 感谢您的信息【参考方案2】:
db.company.update(
    _id: "1",
    data: 
        $elemMatch: 
            value: 'emp11'
        
    
, 
    $set: 
        'data.$.value': 'emp99'
    
)

【讨论】:

请添加 cmets 以解释问题所在以及您的代码 sn-p 如何显示正确的解决方案。 基本上您所做的是将要更新的数据传递到第一个查询对象中。 data: $elemMatch: value: 'emp11' 基本上是在说“在数据数组(或任何你的数据)中,将元素与值“emp11”匹配。然后在查询的$set 部分,我们正在执行$set: "data.$ .value": "emp99"`` 这基本上是说将数据项设置为新值“emp99”。它如何找到特定数据项是通过使用找到正确元素的猫鼬$ 运算符索引,在引擎盖下。

以上是关于Mongoose:更新特定文档数组的元素的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose/Mongo:更新不保存

Mongoose 不更新 mongodb 中的数组

如何使用节点 js 更新 mongo 文档中的数组元素?

如何从 mongoose 的 mongo 文档中返回一个数组?

Mongoose:通过 findOneAndUpdate 查询使用对象数组的总和更新根数据属性不起作用

Mongo/Mongoose Invalid atomic update value 错误