Để giải thích tất cả các trường hợp có thể xảy ra ở đây, hãy xem xét từng trường hợp tài liệu:
Nếu tài liệu của bạn cần thay đổi trông giống như sau:
{
"_id": "efgh",
"name": "Jerry"
}
Sau đó, một trạng thái cập nhật như thế này:
db.collection.update(
{ "_id": "efgh" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Kết quả là:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}
Vì vậy, mảng được tạo và mục mới được thêm vào.
Nếu tài liệu của bạn đã có một mảng như thế này:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
}
]
}
Và về cơ bản bạn thực hiện cùng một tuyên bố:
db.collection.update(
{ "_id": "abcd" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)
Sau đó, nội dung tài liệu mới được nối vào mảng hiện có:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
},
{
"field1": "abc",
"field2": "def"
}
]
}
Tuy nhiên, nếu tài liệu gốc của bạn có trường được đặt tên nhưng nó không phải là một mảng, như sau:
{
"_id": "efgh",
"name": "Jerry",
"myArray": 123
}
Sau đó, hãy đảm bảo đó không phải là một mảng bằng cách kiểm tra trong điều kiện truy vấn và sử dụng $set
thay vào đó:
db.collection.update(
{ "_id": "efgh", "myArray.0": { "$exists": false } },
{ "$set": { "myArray": [{ "field1": "abc", "field2": "def" }] } }
)
Điều đó sẽ ghi đè một cách an toàn phần tử không phải là một mảng (ký hiệu dấu chấm "myArray.0" có nghĩa là phần tử mảng đầu tiên, không đúng) bằng một mảng mới chứa nội dung của bạn. Kết quả giống như ban đầu:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}