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

kzr*_*sal 3 mongoose mongodb node.js mongodb-query

我正在收集称为“公司”的文件。

公司1-

{ 
  _id: '1',
  data:[
    {_id:'11', value: 'emp11'},
    {_id:'12', value: 'emp12'}
  ]
}
Run Code Online (Sandbox Code Playgroud)

公司2-

 { 
  _id: '2',
  data:[
    {_id:'21', value: 'emp21'},
    {_id:'22', value: 'emp22'}
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

companyModel.findById('1', function(err, company) {
    return company.data.update(
        {_id: '11'},
        {$set: {value: 'emp99'}}
    );
});
Run Code Online (Sandbox Code Playgroud)

我可以找到这家公司,但是之后却显示出一个错误-

company.data.update is not a function
Run Code Online (Sandbox Code Playgroud)

请提出可能的解决方案。

Pra*_*l M 7

companyModel.update(
  { "_id" : :"1", "data._id": "11" }, 
  { "$set": { "data.$.value": "emp99" }}, 
  function(err, company) {
    console.log(company)
})
Run Code Online (Sandbox Code Playgroud)

有没有必要使用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()
});
Run Code Online (Sandbox Code Playgroud)