2016-04-12 9 views
4

ich ein Dokument haben, das wie folgt aussieht:MongoDB ein Element aus einem Array innerhalb eines Arrays von Objekten entfernen

{ 
    "_id" : ObjectId("56fea43a571332cc97e06d9c"), 
    "sections" : [ 
    { 
     "_id" : ObjectId("56fea43a571332cc97e06d9e"), 
     "registered" : [ 
     "123", 
     "e3d65a4e-2552-4995-ac5a-3c5180258d87" 
     ] 
    } 
    ] 
} 

Ich mag würde die 'e3d65a4e-2552-4995-ac5a-3c5180258d87' im registered Array von nur die spezifischen Abschnitt entfernen mit der _id von '56fea43a571332cc97e06d9e'.

Mein aktueller Versuch ist so etwas, aber es gibt nur das ursprüngliche Dokument unverändert zurück.

db.test.findOneAndUpdate(
{ 
    $and: [ 
    {'sections._id': ObjectId('56fea43a571332cc97e06d9e')}, 
    {'sections.registered': 'e3d65a4e-2552-4995-ac5a-3c5180258d87'} 
    ] 
}, 
{ 
    $pull: { 
    $and: [ 
     {'sections._id': ObjectId('56fea43a571332cc97e06d9e')}, 
     {'sections.registered': 'e3d65a4e-2552-4995-ac5a-3c5180258d87'} 
    ] 
    } 
}) 

Ich habe in zu $pull sehe, aber ich kann nicht scheinen, um herauszufinden, wie es auf einer Reihe von verschachtelten Objekten zu arbeiten, um ein weiteres Array enthalten. Die $pull Beispiele scheinen alle nur mit einer Verschachtelungsebene zu arbeiten. Wie entferne ich den übereinstimmenden Eintrag aus dem Array registered des Elements im Array sections mit der _id, die ich liefern?

Antwort

2

Sie müssen den Positionsoperator $ verwenden, um das Element aus Ihrem Array zu entfernen. Sie brauchen das, weil "Abschnitte" ein Array von Unterdokumenten ist.

db.test.findOneAndUpdate(
    { "sections._id" : ObjectId("56fea43a571332cc97e06d9e") }, 
    { "$pull": { "sections.$.registered": "e3d65a4e-2552-4995-ac5a-3c5180258d87" } } 
) 
+0

Wird dies keine Instanz von ' "e3d65a4e-2552-4995-AC5a-3c5180258d87"' in einem der Abschnitte entfernen? Ich möchte nur diese Zeichenfolge aus dem registrierten Array des bestimmten Abschnitts entfernen. – jergason

+0

Ok nach dem Test schien das zu funktionieren, aber ich habe keine Ahnung warum. Woher weiß es, nur den $ pull-Operator auf den spezifischen Abschnitt mit dem passenden '_id' anzuwenden? – jergason

+0

Ok, ich lese eigentlich die Dokumente für '$' wie ein menschliches Wesen. Das macht Sinn. Danke für Ihre Hilfe. – jergason

Verwandte Themen