2017-11-25 6 views
1

Ich versuche, ein Array im Dokument zu aktualisieren, indem Sie Objekt hinzufügen, wenn es nicht existiert, und das Objekt im Array andernfalls ersetzen. Aber nichts ($ push, $ addToSet) mit Ausnahme des $ set-Parameters tut irgendetwas, und $ set arbeitet wie erwartet - überschreibt das gesamte Array. Mein Mungo Schema:Mongoose: Aktualisierungsarray im Dokument funktioniert nicht

var cartSchema = mongoose.Schema({ 
    mail: String, 
    items: Array 
}); 

Der Post-Request-Handler:

app.post('/addToCart', function(req, res) { 
var request = req.body; 
Cart.findOneAndUpdate({ 
     "mail": request.mail 
    }, { 
     $addToSet: { 
      "items": request.item 
     } 
    }, { 
     upsert: true 
    }, 
    function(err, result) { 
     console.log(result); 
    } 
); 
    res.send(true); 
}); 

Die Daten, die ich vom Client bin das Senden:

{ 
"mail":"[email protected]", 
"item":{ 
     "_id":"59da78db7e9e0433280578ec", 
     "manufacturer":"Schecter", 
     "referenceNo":"Daemon-412", 
     "type":"Gitare", 
     "image":"images/ba9727909d6c3c26412341907e7e12041507489988265.jpeg", 
     "__v":0, 
     "subcategories":[ 
      "Elektricne" 
     ] 
} 
} 

EDIT:

Ich habe auch dieses Protokoll, wenn ich ‚addToCart‘ Anfrage auslösen:

{ MongoError: The field 'items' must be an array but is of type object in 
document {_id: ObjectId('5a19ae2884d236048c8c91e2')} 
+0

Was ist der Inhalt von 'item'? –

+0

Das Json-Objekt am unteren Rand des ursprünglichen Beitrags – bltzrrr

+0

siehe das Update. –

Antwort

0

dies sollten Sie nur arbeiten müssen objectExits Funktion implementieren, wenn das Einzelteil zu testen ist, dass man Sie suchen:

Cart.findOne({ "mail": request.mail }) 
    .exec() 
    .then(cart => { 
     var replaced = cart.items.some((item, i) => { 
      if (item._id == request.item._id)) { 
       cart.items[i] = request.item; 
       return true; 
      } 
     }) 
     if (!replaced) { 
      cart.items.push(request.item); 
     } 
     cart.save(); 
     return cart; 
    }) 
    .catch(err => { 
     console.log(err) 
    }); 
0

Der Vergleich in $ addToSet wäre erfolgreich nur, wenn das vorhandene Dokument die exakt gleichen Felder und Werte hat, und die Felder in der gleichen Reihenfolge sind. Sonst wird der Bediener fehlschlagen.

In Ihrem Fall muss request.item also immer genau gleich sein.

Ich würde empfehlen, ein Modell von "Artikel" zu erstellen. Dann wäre Ihr Einkaufswagenschema wie folgt:

var cartSchema = mongoose.Schema({ 
    mail: String, 
    items: [{ 
     type: ObjectId, 
     ref: 'item', 
    }], 
}); 

Und lassen MongoDB bestimmen, ob das Element vorhanden ist.