Poniżej znajduje się mój kod
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var Cat = mongoose.model('Cat', {
name: String,
age: {type: Number, default: 20},
create: {type: Date, default: Date.now}
});
Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}},function(err, doc){
if(err){
console.log("Something wrong when updating data!");
}
console.log(doc);
});
Mam już trochę danych w bazie danych Mongo i chciałbym uruchomić ten kod, aby zaktualizować nazwę, dla której wiek to 17 lat, a następnie wydrukować wynik na końcu kodu.
Jednak dlaczego wciąż otrzymuję ten sam wynik z konsoli (nie zmodyfikowaną nazwę), ale kiedy idę do wiersza polecenia mongo db i wpisuję „ db.cats.find();
”. Wynik przyszedł ze zmodyfikowaną nazwą.
Następnie wracam, aby ponownie uruchomić ten kod i wynik jest modyfikowany.
Moje pytanie brzmi: jeśli dane zostały zmodyfikowane, to dlaczego wciąż otrzymałem oryginalne dane przy pierwszym logowaniu na konsoli.log.
{ returnOriginal: false }
Dla każdego, kto używa sterownika Node.js zamiast Mongoose, będziesz chciał użyć
{returnOriginal:false}
zamiast{new:true}
.źródło
Tak więc „findOneAndUpdate” wymaga opcji zwrotu oryginalnego dokumentu. Opcją jest:
Powłoka MongoDB
{returnNewDocument: true}
Patrz: https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/
Mangusta
{new: true}
Ref: http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate
Interfejs API sterownika Node.js MongoDB:
{returnOriginal: false}
Ref: http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html#findOneAndUpdate
źródło
'returnDocument' => FindOneAndUpdate::RETURN_DOCUMENT_AFTER
Domyślnie findOneAndUpdate zwraca oryginalny dokument. Jeśli chcesz, aby zwrócił zmodyfikowany dokument, przekaż obiekt opcji
{ new: true }
do funkcji:źródło
_id
zerowy?Dla każdego, kto natknął się na to przy użyciu stylu ES6 / ES7 z natywnymi obietnicami, oto wzór, który możesz przyjąć ...
źródło
To jest zaktualizowany kod dla
findOneAndUpdate
. To działa.źródło
Opiekun Mongoose tutaj. Musisz ustawić
new
opcję natrue
(lub równoważniereturnOriginal
nafalse
)Zobacz dokumenty Mongoose
findOneAndUpdate()
i ten samouczek dotyczący aktualizowania dokumentów w Mongoose .źródło
Jeśli chcesz zwrócić zmieniony dokument, musisz ustawić opcję
{new:true}
Odwołanie do interfejsu API, którego możesz użyćCat.findOneAndUpdate(conditions, update, options, callback) // executes
Podjęte przez oficjalny interfejs API Mongoose http://mongoosejs.com/docs/api.html#findoneandupdate_findOneAndUpdate można użyć następujących parametrów
Inną implementacją, która nie jest wyrażona na oficjalnej stronie interfejsu API i wolę korzystać z niej, jest
Promise
implementacja podstawowa, która pozwala mieć miejsce, w.catch
którym można poradzić sobie z wszystkimi różnymi błędami.źródło
Poniżej pokazano zapytanie dotyczące mangusty
findOneAndUpdate
. Tutajnew: true
służy do pobrania zaktualizowanego dokumentu ifields
służy do uzyskania określonych pól.na przykład.
findOneAndUpdate(conditions, update, options, callback)
źródło
Wiem, że jestem już spóźniony, ale pozwólcie, że dodam tutaj moją prostą i działającą odpowiedź
źródło