För att förklara alla möjliga fall här, överväg varje dokumentärende:
Om ditt dokument som ska ändras ser ut så här:
{
"_id": "efgh",
"name": "Jerry"
}
Sedan en uppdatering så här:
db.collection.update(
{ "_id": "efgh" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Resultat i detta:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}
Så arrayen skapas och det nya objektet läggs till.
Om ditt dokument redan har en sådan array:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
}
]
}
Och du gör i princip samma uttalande:
db.collection.update(
{ "_id": "abcd" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Sedan läggs det nya dokumentinnehållet till den befintliga arrayen:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
},
{
"field1": "abc",
"field2": "def"
}
]
}
Om däremot ditt originaldokument har det namngivna fältet men det inte är en array, så här:
{
"_id": "efgh",
"name": "Jerry",
"myArray": 123
}
Se sedan till att det inte är en array genom att testa i frågevillkoren och använda $set
istället:
db.collection.update(
{ "_id": "efgh", "myArray.0": { "$exists": false } },
{ "$set": { "myArray": [{ "field1": "abc", "field2": "def" }] } }
)
Det kommer säkert att skriva över elementet som inte är en array (punktnotation "myArray.0" betyder första array-elementet, vilket inte är sant ) med en ny array som innehåller ditt innehåll. Resultatet är detsamma som originalet:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}