2017-04-05 1 views
1

ich ein Mongo-Schema habe, die wie folgt aussieht:

{ 
"_id" : ObjectId("58e4222497b2735ba3cd9ec4"), 
"place" : "", 
"plant" : "Test1", 
"eventDate" : ISODate("2017-04-05T00:00:00Z"), 
"event" : "Test123", 
"toBeTested" : [ 
    { 
     "_id" : ObjectId("58e453a07c9f94702ebac93d"), 
     "thingsTested" : [ 
      "A1", 
      "A2", 
      "A3" 
     ] 
    } 
]} 

ich Mungo bin mit einem einzigen Element von thingsTested zu entfernen. Mein Code in Mungo ist:

Layout 
    .update(
     {_id: req.params.parentid}, 
     {$pull: {toBeTested: {thingsTested: 'A3'}}}, 
     function (err, docs){ 
     if (err) { 
      res.send(err); 
     } 
      res.json(docs);  
     } 
    ); 

Wie Sie sehen können, habe ich fest einprogrammiert, dass ich A3 vom thingsTested Satz entfernt werden soll. Das angezeigte Verhalten ist jedoch, dass alle thingsTested gelöscht wird.

Als Followup Frage, wie kann ich sicherstellen, dass der Mungo Befehl entfernt nur A3 in thingsTested mit den _id von 58e453a07c9f94702ebac93d (das Kind ID)?

Danke!

+0

Mögliche Duplikat [MongoDB mit Positions Operator ziehen] (http://stackoverflow.com/questions/26319733/mongodb-pull-with-positional-operator) – Veeram

+1

nah, mit einem positionellen Operator für diese wäre falsch. – ChemicalRocketeer

Antwort

1

Sie gehen zu müssen, ein äußeres Array-Element in der Abfrage auszuwählen, und dann wird das verglichene Element kann mit einem $, wie so referenziert werden:

//         ▼ selecting the toBeTested element 
update({_id: req.params.parentid, 'toBeTested.thingsTested': 'A3'}, 
//       ▼ referencing the selected element 
     {$pull: {'toBeTested.$.thingsTested': 'A3'}}}); 
+0

Wie würde ich den Verweis auf das spezifische 'sachenTested'' _id' ('58e453a07c9f94702ebac93d') hinzufügen? –

+1

Ich bin mir nicht sicher, was genau du meinst, weil die 'sachenTested' -Elemente in deinen Beispieldaten kein' _id' haben, aber ich denke, du musst es nur irgendwo in die Abfrage einfügen, damit du nur übereinstimmst Dokumente, die diese ID haben. Vielleicht etwas wie: '{_id: req.params.parentid, 'toBeTested.thingsTested': 'A3', 'toBeTested.thingsTested.A3._id': [id]}'. Sie können der Abfrage so viele Parameter hinzufügen, wie Sie möchten, es werden nur Dokumente abgeglichen, die alle übereinstimmen. – ChemicalRocketeer

+0

Meine Entschuldigung, ich meinte eigentlich, dass 'toBeTested' eine' _id' hat. Aber das ist hilfreich! Vielen Dank! –

Verwandte Themen