Ich versuche, ein einzelnes Unterelement zu aktualisieren, das in einem Array in einem Mongodb-Dokument enthalten ist. Ich möchte das Feld anhand seines Array-Index referenzieren (Elemente innerhalb des Arrays haben keine Felder, von denen ich garantieren kann, dass sie eindeutige Bezeichner sind). Das scheint einfach zu sein, aber ich kann die Syntax nicht herausfinden.
Folgendes möchte ich in Pseudo-Json tun.
Vor:
{
_id : ...,
other_stuff ... ,
my_array : [
{ ... old content A ... },
{ ... old content B ... },
{ ... old content C ... }
]
}
Nach:
{
_id : ...,
other_stuff ... ,
my_array : [
{ ... old content A ... },
{ ... NEW content B ... },
{ ... old content C ... }
]
}
Die Abfrage sollte ungefähr so aussehen:
//pseudocode
db.my_collection.update(
{_id: ObjectId(document_id), my_array.1 : 1 },
{my_array.$.content: NEW content B }
)
Das funktioniert aber nicht. Ich habe viel zu lange damit verbracht, die Mongodb-Dokumente zu durchsuchen und verschiedene Variationen dieser Syntax auszuprobieren (z. B. Verwenden $slice
usw.). Ich kann keine klare Erklärung dafür finden, wie diese Art von Update in MongoDB durchgeführt werden kann.
Die Aktualisierung eines Array-Elements, auf das in Mongo Shell durch einen Index (z. B. 1) verwiesen wird, kann auch durch direkte Angabe des Indexwerts erfolgen:
db.my_collection.update( {_id : "document_id"}, {$set : {"my_array.1.content" : "New content B"}} )
quelle
Im Mongo-Stil mit dem Positionsoperator '$'. Überprüfen Sie diesen Link für Details.
db.my_collection.update( {_id: ObjectId(document_id), my_array.1 : 1 }, { $set: { "my_array.$.content" : "NEW content B" } } )
quelle
db.my_collection.update( {_id: ObjectId(document_id), my_array : { ... old content A ... } }, { $set: { "my_array.$.content" : "NEW content B" } } )
quelle
Wenn ein Array-Element aktualisiert werden muss, ohne den tatsächlichen Index zu kennen, aber eine eindeutige Kennung des Elements hat:
// Modify a comment in a bucket db.POST_COMMENT.update( { "_id": ObjectId("5ec424a1ed1af85a50855964"), "bucket.commentId": "5eaf258bb80a1f03cd97a3ad_lepf4f" }, { $set: { "bucket.$.text": "Comment text changed", "bucket.$.createdDate": ISODate("2015-12-11T14:12:00.000+0000") } } )
Hier
"bucket.commentId"
ist die eindeutige Kennung eines Array-Elements.quelle
$set
mir nicht. Ich muss einfache Anführungszeichen für das Feld verwenden.Sie können die updateOne-Funktion von mongoDB verwenden, die den Index des Elements im Array übergibt, wenn der Schlüssel des alten Inhalts B beispielsweise "Wert" ist:
[ ... "value" : "old content A" "value" : "old content B" "value" : "old content C" ... ]
Der Befehl sollte folgendermaßen aussehen:
db.collection.updateOne({"_id" : "...,"},{$set: {"my_array.1.value": "NEW content B"}})
quelle
Eine gute Möglichkeit, dies in Javascript mit Backticks zu tun, ist:
const index = 1; ... { $set: { [`myArray.${index}.value`]: "new content"} }, ...
quelle
Wenn ein Array-Element aktualisiert werden muss, ohne zu wissen, dass es sich um einen tatsächlichen Index handelt, der jedoch eine eindeutige Kennung des Elements aufweist
db.getCollection('profiles').update( { 'userId':'4360a380-1540-45d9-b902-200f2d346263', 'skills.name':'css' }, { $set: {'skills.$.proficiencyLevel': 5} }, { multi: true } )
quelle