Para explicar todos os casos possíveis aqui, considere cada caso de documento:
Se o seu documento a ser alterado estiver assim:
{
"_id": "efgh",
"name": "Jerry"
}
Em seguida, uma declaração de atualização como esta:
db.collection.update(
{ "_id": "efgh" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Resultados nisso:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}
Assim, a matriz é criada e o novo item anexado.
Se o seu documento já tiver um array como este:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
}
]
}
E você faz basicamente a mesma declaração:
db.collection.update(
{ "_id": "abcd" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Em seguida, o novo conteúdo do documento é anexado ao array existente:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
},
{
"field1": "abc",
"field2": "def"
}
]
}
Se, no entanto, seu documento original tiver o campo nomeado, mas não for uma matriz, assim:
{
"_id": "efgh",
"name": "Jerry",
"myArray": 123
}
Em seguida, verifique se não é um array testando na condição de consulta e usando
$set
em vez de:db.collection.update(
{ "_id": "efgh", "myArray.0": { "$exists": false } },
{ "$set": { "myArray": [{ "field1": "abc", "field2": "def" }] } }
)
Isso substituirá com segurança o elemento que não é um array ( notação de ponto "myArray.0" significa primeiro elemento de array, o que não é true ) por um novo array contendo seu conteúdo. O resultado é o mesmo do original:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}