Mongoose: обновить элемент массива конкретного документа - PullRequest
0 голосов
/ 06 июля 2018

У меня есть коллекция документов под названием «компания».

компания 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

Пожалуйста, предложите возможное решение.

Ответы [ 2 ]

0 голосов
/ 09 июля 2018
db.company.update({
    _id: "1",
    data: {
        $elemMatch: {
            value: 'emp11'
        }
    }
}, {
    $set: {
        'data.$.value': 'emp99'
    }
})
0 голосов
/ 06 июля 2018
companyModel.update(
  { "_id" : :"1", "data._id": "11" }, 
  { "$set": { "data.$.value": "emp99" }}, 
  function(err, company) {
    console.log(company)
})

Нет необходимости использовать findById , вы можете использовать это напрямую. При обновлении mongo вам нужно искать как документ, так и поле, которое вы хотите обновить. Поле, которое вы хотите обновить, очень важно, поскольку оно используется для определения местоположения массива при использовании $.

Однако вы также можете сделать это следующим образом:

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()
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...