2014-05-23 17 views
13

Ich habe viele Fragen zu verschachtelten Objekten durchsucht, aber alle, die ich gefunden habe, wo auf Array [s] bezogen.Verschachteltes Objekt in Mungo aktualisieren

Ich bin auf der Suche nach einer Aktualisierung einfach verschachteltes Objekt in Mungo.

Von hier http://mongoosejs.com/docs/guide.html

there is an example schema : 
var blogSchema = new Schema({ 
    title: String, 
    author: String, 
    body: String, 
    comments: [{ body: String, date: Date }], 
    date: { type: Date, default: Date.now }, 
    hidden: Boolean, 
    meta: { 
    votes: Number, 
    favs: Number 
    } 
}); 

Sobald ein Dokument erstellt,

Wie kann ich die Favoriten-Nummer ändern später?

Es gibt kein Dokument für dasselbe, das ich finden könnte. Diese

ist das, was ich getan habe:

blog.findById(entityId, function(err, mainDoc){ 
     if(err || !mainDoc) return next(err || 'Document not found'); 
     var subDoc = mainDoc['meta']; 
     if(subDoc){ 
     subDoc = _.extend(subDoc, { favs : 56 }); //_ lib already available 
     console.log(mainDoc.get('meta')); //Prints the updated result with favs = 56 OK 
     mainDoc.save(function(err, doc){ 
      console.log(doc.get('meta')); // prints the updated results with favs = 56 OK 
     }); 
     } else next('Not found'); 
    }); 

Alles funktioniert Datei und alle Konsole gibt das gewünschte Ergebnis.

Aber wenn ich auf Mungo-Konsole wechseln und das Dokument abfragen, bekomme ich das aktualisierte Ergebnis nicht.

Ich weiß, es kann andere Wege geben, um das gleiche zu erreichen, aber ich suche nur, was ich in diesem bestimmten Code falsch mache.

Warum gibt die Konsole nach dem Speichern des Dokuments unübertroffene Daten aus der Datenbank?

Beim Aktivieren der Mungo-Debug-Option habe ich festgestellt, dass in der Abfrage keine solchen Daten aktualisiert werden müssen. Abfrage wird mit leerem $ set ausgelöst. {$ Satz: {}}

Antwort

15

Wenn Sie nur den Wert von favs ändern möchten, können Sie eine einfachere Abfrage verwenden:

blog.findByIdAndUpdate(entityId, {$set: {'meta.favs': 56}}, function(err, doc) { 
    console.log(doc); 
}); 
+3

weiß, dass ich gut diese Antwort ist besser. aber ich wollte eigentlich herausfinden, was ich in meinem obigen Code falsch mache. – codeofnode

+0

Wenn 'favs' eine Variable ist. Dann wie kann ich etwas wie unten erreichen? blog.findByIdAndUpdate (entityId, {$ setzen: {'meta [favs]': 56}}, Funktion (err, doc) { console.log (doc); }); –

0

Das Problem ist, dass man nicht alles mit Daten von Mungo tun können Sobald Sie es haben, senden Sie es an den Client.

JEDOCH gibt es die Lean-Methode, die es macht, damit Sie dann die Informationen aktualisieren und machen können, was Sie wollen.

, die wie folgt aussehen:

blog.findById(entityId).lean().exec(function (err, mainDoc) { 
    if (err || !mainDoc) { 
     return next(err || 'Document not found'); 
    } 
    var subDoc = mainDoc.meta; 
    if(subDoc){ 
     subDoc.favs = 56; 
     blog.update({_id: entityId}, mainDoc, function(err, doc){ 
      console.log(doc.get('meta')); 
     }); 
    } else { 
     next('Not found'); 
    } 
}); 
Verwandte Themen