С помощью с помощью некоторых сотрудников Mongoose я обнаружил, что проблема заключалась в том, что я использовал функцию document.update()
вместе с функцией document.save()
.
Функция document.update()
- это отдельная асинхронная операция с обратным вызовом, и, как упоминалось @Industrial Comet, она не возвращает документ.
Чтобы внести изменения, которые будут применены в сохраненной, возвращенной версии документа, необходимо применить каждое изменение непосредственно к объекту документа в виде:
myDocument.foo = 'new info';
myDocument.bar = 'other new info';
myDocument.save((err, newDocument) => {
// new Document available here
});
EDIT:
Я обнаружил , вы также можете обновить кучу различных значений с помощью объекта обновленной информации, используя myDocument.set(objectOfUpdatedInfo)
, а затем получить сохраненный документ, возвращенный с myDocument.save()
.
Так что мое решение сделать это:
myDocument.set(objectOfUpdatedInformation);
myDocument.save().then((savedDoc) => {
res.json({ response: 'success' savedDoc: savedDoc });
}).catch((err) => { console.log(err); });
Ниже приводится моя первоначальная оценка ситуации до того, как я узнал, что document.protype.save()
существует. (Вызвал у меня дополнительное горе из-за того, что я не внимательно прочитал документацию)
Но я хотел обновить свой документ с помощью множества различных полей в объекте. Я надеялся, что смогу сделать это, а затем получить обновленный документ. Похоже, я не могу сделать это с myDocument.update(objectOfUpdatedInfo)
, потому что:
- метод
.update()
не предоставляет обновленную информацию в обратном вызове
- если я использую сохранение после метода
.update()
, изменения не отображаются в возвращенном сохраненном документе.
Так что мои варианты:
- Применить изменения к отдельным ключам / значениям в объекте, а затем
.save()
it.
- Запрашивать объект и обновлять его с помощью
Collection.findOneAndUpdate()
.
И Document.save()
, и Collection.findOneAndUpdate()
возвращают обновленный документ, но Document.save()
плохо работает с Document.update()
, а Document.update()
не возвращает документ.
Мне бы хотелось иметь возможность аккуратно подключать объект, полный обновленной информации, к уже запрашиваемому объекту myDocument
, а затем получать возврат документа обновления, но, к сожалению, сейчас это не кажется возможно в мангусте. Я спросил об этом, и может быть дальнейшее обсуждение в этом выпуске github . На данный момент это выбранное мной решение с использованием обновлений с вычисленными значениями ключей:
// Need to a document with an object full of values...
for (var property in updatedInfo) {
myDocument[property] = updatedInfo[property];
}
myDocument.save().then((savedDoc) => {
res.json({ response: 'success' savedDoc: savedDoc });
}).catch((err) => { console.log(err); });