For at forklare alle de mulige sager her, skal du overveje hver dokumentsag:
Hvis dit dokument, der skal ændres, ser sådan ud:
{
"_id": "efgh",
"name": "Jerry"
}
Så en opdateringserklæring som denne:
db.collection.update(
{ "_id": "efgh" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Dette resulterer i:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}
Så arrayet oprettes og det nye element tilføjes.
Hvis dit dokument allerede har et array som dette:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
}
]
}
Og du gør stort set det samme udsagn:
db.collection.update(
{ "_id": "abcd" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Derefter føjes det nye dokumentindhold til det eksisterende array:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
},
{
"field1": "abc",
"field2": "def"
}
]
}
Hvis dit originale dokument har det navngivne felt, men det ikke er et array, som dette:
{
"_id": "efgh",
"name": "Jerry",
"myArray": 123
}
Sørg derefter for, at det ikke er et array ved at teste i forespørgselstilstanden og bruge $set
i stedet:
db.collection.update(
{ "_id": "efgh", "myArray.0": { "$exists": false } },
{ "$set": { "myArray": [{ "field1": "abc", "field2": "def" }] } }
)
Det vil sikkert overskrive det element, der ikke er et array (punktnotation "myArray.0" betyder det første array-element, hvilket ikke er sandt) med et nyt array, der indeholder dit indhold. Resultatet er det samme som originalen:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}