2016-10-26 2 views
0

Я пытаюсь обновить объекты в массиве в документе. Объекты не являются поддоменами и поэтому не имеют уникального идентификатора. Я пробовал смотреть на различные методы для этого, но он просто не имеет никакого эффекта (как в, ничего не происходит - никаких ошибок, но документ не обновляется.Обновление объектов внутри массива в MongoDB с помощью mongoose

Наверное, проще просто показать . код во-первых, вот пример документа в этой коллекции:

{ 
    _id: 123, 
    //other fields go here 
    submissions: [ 
     { 
      submission: 1, 
      downloaded: null, //This should be an ISODate when populated 
      assessor: null, //This should be an ObjectID when populated 
      feedbackUploaded: null, //This should also be an ISODate 
      path: '401Test1.doc', 
      assessorNotes: null //This should be a string when populated 
     }, 
     { 
      submission: 2, 
      downloaded: null, 
      assessor: null, 
      feedbackUploaded: null, 
      path: '401Test2.doc', 
      assessorNotes: null 
     } 
    ] 
} 

И теперь мой мангуст запроса (в пределах экспресс-маршрута):

const unit = req.body.unit; //e.g. 123 
const submission = req.body.submission // e.g. 2 
const date = Date.now(); 

Unit.update({ "_id": unit, "submissions.submission": submission }, { 
     $set: { 
      'submissions.assessorNotes': req.body.assessorComments, 
      'submissions.feedbackUploaded': date, 
      'submissions.assessor': req.body.assessor 
     }, function(err){ 
      //callback 
     } 
    }) 

Я также попытался это с помощью $ обозначения в команда $set, т.е. 'submissions.$.assessorNotes': req.body.assessorComments', но это тоже не работает.

Куда я иду не так?

Cheers!

Chris

+0

он должен работать с позиционным оператором '$'. ты уверен, что у тебя есть матч? если вы просто «находите» с этими параметрами, вы найдете документ? – TomG

+0

Пробовал запустить 'find', и он вернул правильный документ, так что похоже, что я получаю соответствие - он просто не обновляется. Попробовали с 'findOneAndUpdate', а также - та же проблема – Chris

ответ

2

Просто проверил это с позиционным оператором, как упоминалось выше, TomG в оболочке.

> db.foo.find().pretty() 
{ 
    "_id" : 123, 
    "submissions" : [ 
     { 
      "submission" : 1, 
      "downloaded" : null, 
      "assessor" : null, 
      "feedbackUploaded" : null, 
      "path" : "401Test1.doc", 
      "assessorNotes" : null 
     }, 
     { 
      "submission" : 2, 
      "downloaded" : null, 
      "assessor" : null, 
      "feedbackUploaded" : null, 
      "path" : "401Test2.doc", 
      "assessorNotes" : null 
     } 
    ] 
} 

Затем я запустил команду обновления:

db.foo.update(
    { _id: 123, "submissions.submission": 2 }, 
    { $set: { 
    "submissions.$.assessorNotes": "testAssessorNotes", 
    "submissions.$.feedbackUploaded": new Date(), 
    "submissions.$.assessor": "testAssessor" 
    } } 
) 

Результаты таковы:

{ 
    "_id" : 123, 
    "submissions" : [ 
     { 
      "submission" : 1, 
      "downloaded" : null, 
      "assessor" : null, 
      "feedbackUploaded" : null, 
      "path" : "401Test1.doc", 
      "assessorNotes" : null 
     }, 
     { 
      "submission" : 2, 
      "downloaded" : null, 
      "assessor" : "testAssessor", 
      "feedbackUploaded" : ISODate("2016-10-26T15:33:09.573Z"), 
      "path" : "401Test2.doc", 
      "assessorNotes" : "testAssessorNotes" 
     } 
    ] 
} 

Edit: Я подозреваю, что ошибка может быть также с обновлением в Mongoose, вы можете попробовать изменить оба оператора позиционирования, а также использовать findOneAndUpdate, если он соответствует вашим потребностям, а не обновляется.

Пожалуйста, попробуйте этот запрос для Mongoose:

Unit.update(
    { "_id": unit, "submissions.submission": submission }, 
    { $set: { 
     'submissions.$.assessorNotes': req.body.assessorComments, 
     'submissions.$.feedbackUploaded': date, 
     'submissions.$.assessor': req.body.assessor 
    } }, function(err, result) { 
     //callback 
    } 
}); 
+0

Просто попробовал' findOneAndUpdate' и, похоже, та же проблема. Когда я делаю «найти», как предложил Том, он возвращает правильный документ, поэтому выглядит так, как будто у меня есть совпадение. Есть ли другая альтернатива 'update' и' findOneAndUpdate'? Возможно, используя 'save' или что-то подобное? – Chris

+0

Вы можете использовать find/findOne для возврата вашего объекта в обратный вызов, затем изменить значение и, наконец, вызвать функцию сохранения. Вы также используете оператор позиционирования в своем наборе $ set? – dyouberg

+0

Я добавил запрос для Mongoose, вы можете попробовать это и посмотреть, работает ли он? Я заметил недостающую скобку в конце вашей команды set. – dyouberg

Смежные вопросы