Mongoose save () возвращает старую версию, а не сохраненную версию документа - PullRequest
0 голосов
/ 07 сентября 2018

Я, должно быть, что-то упустил, но кажется, что мой Document.prototype.save() не работает для меня должным образом в Mongoose 5.2.10.

В документах говорится , что обратный вызов возвращает сохраненный документ .

Обратный вызов получит два параметра

  • err если произошла ошибка
  • product который является сохраненным product

Для меня это похоже на возврат оригинальной версии документа перед обновлением и сохранение. Либо я делаю что-то не так, либо документы немного вводят в заблуждение или расплывчаты.

После вызова сохранения документ обновляется в базе данных, но обратный вызов возвращает старый документ до изменения.

Я вызывал save следующим образом (внутри асинхронной функции):

const myDocument = await User.findOne({ name: 'billy' });
const updatedInfo = {
    foo: 'update here',
    bar: 'some other new stuff'
};
myDocument.update({ $set: updatedInfo }, (err) => { console.log(err) });
myDocument.save((err, savedDoc) => {
    if (err) { console.log(err); }
    // Should return saved doc here
    console.log(savedDoc);
});

И вот так:

myDocument.update({ $set: updatedInfo }, (err) => { console.log(err) });
myDocument.save().then((savedDoc) => {
    // Should return saved doc here
    console.log(savedDoc);
}).catch((err) => { console.log(err); });

Но не могу заставить его вернуть мне сохраненный документ. savedDoc оказывается старой версией документа, а новая версия сохраняется в базе данных.

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Используйте findOneAndUpdate с {new : true}, чтобы получить новую версию

Model.findOneAndUpdate({statue: 'active'}, {$set:{qtt:0}}, {new: true}, function(err, doc){
    if(err){
        console.log("Something wrong when updating data!");
    }

    console.log(doc);
});
0 голосов
/ 10 сентября 2018

С помощью с помощью некоторых сотрудников 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); });
0 голосов
/ 07 сентября 2018

Функция обновления Mongoose не возвращает обновленный документ. Кроме того, изменения, сделанные с помощью функции обновления, являются отдельной асинхронной операцией и не должны использоваться вместе с функцией обновления.

  1. Сначала запросите документ
  2. Изменить документ, назначив новые значения отдельным клавишам
  3. Сохранить и вернуть обновленный документ

    docs.findById (id, (err, myDocument) => { // Выбор документа, который вы хотите изменить myDocument.foo = // Обновленный контент myDocument.save ((err, newDocument) => { // Возвращает новый документ }) })

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...