Um hier alle möglichen Fälle zu erklären, betrachten Sie jeden Dokumentenfall:
Wenn Ihr zu änderndes Dokument so aussieht:
{
"_id": "efgh",
"name": "Jerry"
}
Dann eine Update-Anweisung wie diese:
db.collection.update(
{ "_id": "efgh" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Ergebnisse in diesem:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}
Also wird das Array erstellt und das neue Element angehängt.
Wenn Ihr Dokument bereits ein Array wie dieses hat:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
}
]
}
Und Sie tun im Grunde die gleiche Aussage:
db.collection.update(
{ "_id": "abcd" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Dann wird der neue Dokumentinhalt an das bestehende Array angehängt:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
},
{
"field1": "abc",
"field2": "def"
}
]
}
Wenn Ihr Originaldokument jedoch das benannte Feld hat, aber kein Array ist, wie hier:
{
"_id": "efgh",
"name": "Jerry",
"myArray": 123
}
Stellen Sie dann sicher, dass es sich nicht um ein Array handelt, indem Sie die Abfragebedingung testen und verwenden $set
stattdessen:
db.collection.update(
{ "_id": "efgh", "myArray.0": { "$exists": false } },
{ "$set": { "myArray": [{ "field1": "abc", "field2": "def" }] } }
)
Dadurch wird das Element, das kein Array ist (Punktnotation "myArray.0" bedeutet erstes Array-Element, was nicht wahr ist), sicher mit einem neuen Array überschrieben, das Ihren Inhalt enthält. Das Ergebnis ist dasselbe wie das Original:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}