2017-05-17 32 views
2

Schauen Sie sich mein folgendes Beispielschema an.Wie update Kind Array und Elternelement beide gleichzeitig mit Mungo?

const ParentSchema = new mongoose.Schema({ 
    id:String 
    name:String 
    age:Number 
    child:[{ 
     id:String, 
     name:String, 
     age:Number}] 
    }) 

const collectionName = mongoose.model("parent", ParentSchema) 

Jetzt möchte ich das Alter von Kind und Eltern für die spezifische ID von jedem von ihnen erhöhen. Beides zur selben Zeit. Ich versuchte es mit der folgenden Abfrage

collectionName.update({'_id':new mongoose.Types.ObjectId("59198a3e73ae303f97e97e8f"),'child._id':new mongoose.Types.ObjectId("59198a3e73ae303f97e97eds")}, 
{$inc:{'age':1},$inc:{'child.$.age':1}},function(err,res){ 
    if(err){ 
     console.log(err.message) 
    }else{ 
console.log(res) 
} 

Die obige Abfrage funktionierte gut, aber es aktualisiert nur das Kindalter und nicht das Elternteil. Jetzt bin ich nicht sicher, wie ich meine Abfrage formen sollte, um beide zu aktualisieren?

Antwort

3

Diese Abfrage Arbeit für mich:

db.collection.update({ 
    '_id': new mongoose.Types.ObjectId("59198a3e73ae303f97e97e8f"), 
    'child.id': A SPECIFIC ID 
}, 
{ 
    $inc: { 'age': 1, 'child.$.age': 1 } 
}); 

Ihre Abfrage funktioniert nicht, weil der $ Bediener eine Bedingung muss das passende Kind aus dem verschachtelten Array zu überprüfen, bevor zu erhöhen. Wenn Sie tiefer gehen wollen, hier ist die official documentation.

+0

Vielen Dank für die Korrektur @Gianmarco. Eigentlich ist es schlecht, dass ich die fragliche Anfrage geschrieben habe. Aber in meinem richtigen Programm hatte ich die richtige Version der Anfrage geschrieben, wie Sie es erwähnt haben. Und es hat nicht funktioniert. Die von Ihnen erwähnte Abfrage aktualisiert actually die child.age für den spezifischen Zustand von child.id, aber das Alter des übergeordneten Objekts wurde nicht aktualisiert. –

+0

Ich habe diese Abfrage in der mongo-Shell getestet und es funktioniert. In meinem Fall verwendete die Abfrage nicht die ID, aber sie verwendete diese Bedingung: {'name': "mark", "child.name": "marks son"}. Jetzt weiß ich nicht, ob die Bedingungstyp das Ergebnis ändern kann, aber wenn Sie möchten, können Sie versuchen, es zu überprüfen. – Gianmarco

+1

ja rechts @Gianmarco. Du hattest Recht und deine Version der Abfrage funktionierte tatsächlich auch für mich, nachdem ich sie auf meinem Code getestet hatte. Im Grunde lag ich also falsch bei der Implementierung von zwei $ inc Sets. Und da war es falsch. Als ich meine Version der Abfrage mit zwei Inkrementen in einem einzelnen $ inc-Satz aktualisierte, funktionierte es tatsächlich. Vielen Dank für Ihre Zeit –

Verwandte Themen