ここで考えられるすべてのケースを説明するために、各ドキュメントのケースを検討してください。
変更するドキュメントが次のようになっている場合:
{
"_id": "efgh",
"name": "Jerry"
}
次に、次のような更新ステートメント:
db.collection.update(
{ "_id": "efgh" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
結果:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}
したがって、配列が作成され、新しいアイテムが追加されます。
ドキュメントにすでに次のような配列がある場合:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
}
]
}
そして、あなたは基本的に同じステートメントを行います:
db.collection.update(
{ "_id": "abcd" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
次に、新しいドキュメントコンテンツが既存のアレイに追加されます:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
},
{
"field1": "abc",
"field2": "def"
}
]
}
ただし、元のドキュメントに名前付きフィールドがあり、配列ではない場合は、次のようになります。
{
"_id": "efgh",
"name": "Jerry",
"myArray": 123
}
次に、クエリ条件でテストし、を使用して、配列ではないことを確認します。 $set
代わりに:
db.collection.update(
{ "_id": "efgh", "myArray.0": { "$exists": false } },
{ "$set": { "myArray": [{ "field1": "abc", "field2": "def" }] } }
)
これにより、配列ではない要素(ドット表記「myArray.0」は最初の配列要素を意味しますが、これはtrueではありません)をコンテンツを含む新しい配列で安全に上書きします。結果は元の結果と同じです:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}