Per spiegare tutti i casi possibili qui, considera ogni caso di documento:
Se il tuo documento da modificare ha questo aspetto:
{
"_id": "efgh",
"name": "Jerry"
}
Quindi una dichiarazione di aggiornamento come questa:
db.collection.update(
{ "_id": "efgh" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Risulta in questo:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}
Quindi l'array viene creato e il nuovo elemento aggiunto.
Se il tuo documento ha già un array come questo:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
}
]
}
E fai praticamente la stessa affermazione:
db.collection.update(
{ "_id": "abcd" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Quindi il nuovo contenuto del documento viene aggiunto all'array esistente:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
},
{
"field1": "abc",
"field2": "def"
}
]
}
Se invece il tuo documento originale ha il campo con nome ma non è un array, come questo:
{
"_id": "efgh",
"name": "Jerry",
"myArray": 123
}
Quindi assicurati che non sia un array verificando nella condizione di query e utilizzando $set
invece:
db.collection.update(
{ "_id": "efgh", "myArray.0": { "$exists": false } },
{ "$set": { "myArray": [{ "field1": "abc", "field2": "def" }] } }
)
Ciò sovrascriverà in modo sicuro l'elemento che non è un array ( la notazione del punto "myArray.0" significa il primo elemento dell'array, che non è true ) con un nuovo array contenente il tuo contenuto. Il risultato è lo stesso dell'originale:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}