Nehmen Sie im folgenden Beispiel an, dass sich das Dokument in der Auflistung db.people befindet .
Wie entferne ich das dritte Element des Interessenarrays anhand seines Index ?
{
"_id" : ObjectId("4d1cb5de451600000000497a"),
"name" : "dannie",
"interests" : [
"guitar",
"programming",
"gadgets",
"reading"
]
}
Dies ist meine aktuelle Lösung:
var interests = db.people.findOne({"name":"dannie"}).interests;
interests.splice(2,1)
db.people.update({"name":"dannie"}, {"$set" : {"interests" : interests}});
Gibt es einen direkteren Weg?
Antworten:
Es gibt keine direkte Möglichkeit zum Ziehen / Entfernen nach Array-Index. In der Tat ist dies eine offene Ausgabe http://jira.mongodb.org/browse/SERVER-1014 , Sie können dafür stimmen.
Die Problemumgehung verwendet $ unset und dann $ pull:
Update: Wie in einigen Kommentaren erwähnt, ist dieser Ansatz nicht atomar und kann einige Rennbedingungen verursachen, wenn andere Clients zwischen den beiden Operationen lesen und / oder schreiben. Wenn die Operation atomar sein muss, können wir:
quelle
Sie können den
$pull
Modifikator derupdate
Operation verwenden, um ein bestimmtes Element in einem Array zu entfernen. Falls Sie eine Abfrage angegeben haben, sieht diese folgendermaßen aus:Sie können auch in Betracht ziehen
$pullAll
, alle Vorkommen zu entfernen. Mehr dazu auf der offiziellen Dokumentationsseite - http://www.mongodb.org/display/DOCS/Updating#Updating-%24pullDies verwendet den Index nicht als Kriterium zum Entfernen eines Elements, kann jedoch in ähnlichen Fällen hilfreich sein. IMO, die Verwendung von Indizes zur Adressierung von Elementen innerhalb eines Arrays ist nicht sehr zuverlässig, da Mongodb in einer Elementreihenfolge nicht so konsistent ist, wie ich weiß.
quelle
Anstatt das Unset zu verwenden (wie in der akzeptierten Antwort), löse ich dies, indem ich das Feld auf einen eindeutigen Wert setze (dh nicht NULL) und diesen Wert dann sofort ziehe. Aus asynchroner Sicht etwas sicherer. Hier ist der Code:
Hoffentlich wird Mongo dies beheben, indem er möglicherweise den Modifikator $ position erweitert, um sowohl $ pull als auch $ push zu unterstützen.
quelle
Ich würde empfehlen, für jedes Unterdokument im Array ein GUID-Feld (ich verwende normalerweise ObjectID) oder ein automatisch inkrementierendes Feld zu verwenden.
Mit dieser GUID ist es einfach, einen $ pull auszugeben und sicherzustellen, dass der richtige gezogen wird. Gleiches gilt für andere Array-Operationen.
quelle
Ab
Mongo 4.4
dem$function
Aggregationsoperator können Sie eine benutzerdefinierte Javascript-Funktion anwenden, um ein Verhalten zu implementieren, das von der MongoDB-Abfragesprache nicht unterstützt wird.So aktualisieren Sie beispielsweise ein Array, indem Sie ein Element an einem bestimmten Index entfernen:
$function
nimmt 3 Parameter:body
Dies ist die anzuwendende Funktion, deren Parameter das zu ändernde Array ist. Die Funktion besteht hier einfach darin, einen Spleiß zu verwenden, um 1 Element am Index 2 zu entfernen.args
, enthält die Felder aus dem Datensatz, die diebody
Funktion als Parameter verwendet. In unserem Fall"$interests"
.lang
Dies ist die Sprache, in der diebody
Funktion geschrieben ist. Nurjs
ist derzeit verfügbar.quelle
In Mongodb 4.2 können Sie dies tun:
P ist der Index des Elements, das Sie aus dem Array entfernen möchten.
Wenn Sie bis zum Ende von P entfernen möchten:
quelle
Für Leute, die eine Antwort mit Mungo mit nodejs suchen. So mache ich es.
Ich kann diese Antwort umschreiben, wenn sie nicht sehr gut verstanden wird, aber ich denke, ist in Ordnung.
Hoffe das hilft dir, ich habe viel Zeit verloren, als ich mich diesem Problem gestellt habe.
quelle
Anstatt $ pull zu verwenden, können wir $ pop verwenden, um Elemente in einem Array anhand seines Index zu entfernen. Sie sollten jedoch 1 von der Indexposition abziehen, um sie basierend auf dem Index zu entfernen.
Zum Beispiel, wenn Sie das Element in Index 0 entfernen möchten, sollten Sie -1 verwenden, für Index 1 sollten Sie 0 verwenden und so weiter ...
Abfrage zum Entfernen des 3. Elements (Gadgets):
db.people.update({"name":"dannie"}, {'$pop': {"interests": 1}})
als Referenz: https://docs.mongodb.com/manual/reference/operator/update/pop/
quelle
$pop
kann nur das erste oder letzte Element aus dem Array entfernt werden. Die Abfrage in dieser Antwort entfernt das dritte Element nicht.