Aby wyjaśnić wszystkie możliwe przypadki tutaj, rozważ każdy przypadek dokumentu:
Jeśli dokument do zmiany wygląda tak:
{
"_id": "efgh",
"name": "Jerry"
}
Następnie komunikat o aktualizacji, taki jak ten:
db.collection.update(
{ "_id": "efgh" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Wyniki w tym:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}
Tak więc tworzona jest tablica i dodawany jest nowy element.
Jeśli twój dokument ma już taką tablicę:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
}
]
}
I robisz w zasadzie to samo stwierdzenie:
db.collection.update(
{ "_id": "abcd" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Następnie nowa treść dokumentu jest dodawana do istniejącej tablicy:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
},
{
"field1": "abc",
"field2": "def"
}
]
}
Jeśli jednak oryginalny dokument ma nazwane pole, ale nie jest tablicą, na przykład:
{
"_id": "efgh",
"name": "Jerry",
"myArray": 123
}
Następnie upewnij się, że nie jest to tablica, testując w warunku zapytania i używając $set
zamiast tego:
db.collection.update(
{ "_id": "efgh", "myArray.0": { "$exists": false } },
{ "$set": { "myArray": [{ "field1": "abc", "field2": "def" }] } }
)
Spowoduje to bezpieczne zastąpienie elementu, który nie jest tablicą ( notacja z kropką „myArray.0” oznacza pierwszy element tablicy, co nie jest prawdą ) nową tablicą zawierającą Twoją treść. Wynik jest taki sam jak oryginał:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}