Sự khác biệt giữa lưu và chèn trong Mongo DB là gì? cả hai trông giống nhau
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
Sự khác biệt giữa lưu và chèn trong Mongo DB là gì? cả hai trông giống nhau
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
Câu trả lời:
Lưu Vs Chèn:
Trong các ví dụ cho trước của bạn, hành vi về cơ bản là giống nhau.
save
hành xử khác đi nếu nó được truyền với tham số "_id".
Để lưu, Nếu tài liệu chứa _id
, nó sẽ truy vấn bộ sưu tập trên _id
trường, nếu không, nó sẽ chèn.
Nếu một tài liệu không tồn tại với giá trị _id được chỉ định, phương thức save () thực hiện thao tác chèn với các trường được chỉ định trong tài liệu.
Nếu một tài liệu tồn tại với giá trị _id được chỉ định, phương thức save () thực hiện cập nhật, thay thế tất cả các trường trong bản ghi hiện tại bằng các trường từ tài liệu.
Lưu so với Cập nhật :
update
sửa đổi một tài liệu hiện có phù hợp với thông số truy vấn của bạn. Nếu không có tài liệu phù hợp như vậy, đó là khi upsert
xuất hiện trong hình.
upsert : false
: Không có gì xảy ra khi không có tài liệu như vậy tồn tạiupsert : true
: Tài liệu mới được tạo với nội dung bằng tham số truy vấn và thông số cập nhậtsave
: Không cho phép bất kỳ thông số truy vấn nào. nếu _id
tồn tại và có một tài liệu phù hợp với cùng _id
, nó sẽ thay thế nó. Khi không có _id được chỉ định / không có tài liệu phù hợp, nó sẽ chèn tài liệu dưới dạng tài liệu mới.
Hãy để chúng tôi xem xét hai trường hợp ở đây để tiết kiệm: -
1) Có _id trong doc.
2) Không có _id trong doc.
Save ()
/ \
/ \
Having _id Not Having _id
->In this case save will do -> It will do normal insertion
upsert to insert.Now in this case as insert() do.
what that means, it means
take the document and replace
the complete document having same
_id.
Hãy để chúng tôi xem xét hai trường hợp ở đây để chèn: -
1) Có _id của doc trong bộ sưu tập.
2) Không có _id của doc trong bộ sưu tập.
Insert()
/ \
/ \
Doc Having _id in collection Doc Not Having _id
-> E11000 duplicate key ->Insert a new doc inside the collection.
error index:
save
chèn hoặc cập nhật một tài liệu.
insert
không chỉ chèn
Nhưng trong trường hợp của bạn, nó sẽ làm như vậy, vì tài liệu được cung cấp trong lưu không có _id
trường.
Bằng cách đưa ra một ví dụ
Cứu một Apple
db.fruit.save({"name":"apple", "color":"red","shape":"round"})
WriteResult({ "nInserted" : 1 })
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "red",
"shape" : "round",
"name" : "apple"
}
Lưu một quả táo với _id của quả táo đã lưu trước đó
db.fruit.save(
{"_id" : ObjectId("53fa1809132c1f084b005cd0"),"name":"apple",
"color":"real red","shape":"round"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Bây giờ quả táo chúng tôi đã lưu, màu được cập nhật từ đỏ sang đỏ thật
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "real red",
"shape" : "round",
"name" : "apple"
}
Lưu một quả táo với _id
db.fruit.save({"_id" : ObjectId("55551809132c1f084b005cd0"),
"name":"apple", "color":"real red","shape":"round"})
WriteResult({ "nMatched" : 0, "nUpserted" : 1,
"nModified" : 0, "_id": 55551809132c1f084b005cd0 })
Apple đã chèn vào vì không có táo nào có cùng Id đối tượng để thực hiện cập nhật
Chèn một quả cam
db.fruit.insert({"name":"orange", "color":"orange","shape":"round"})
WriteResult({ "nInserted" : 1 })
Cam được chèn
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "real red",
"shape" : "round",
"name" : "apple"
}
{
"_id" : ObjectId("53fa196d132c1f084b005cd7"),
"color" : "orange",
"shape" : "round",
"name" : "orange"
}
{
"_id" : ObjectId("55551809132c1f084b005cd0"),
"color" : "real red",
"shape" : "round",
"name" : "apple"
}
Vì vậy, save sẽ hoạt động như một bản cập nhật nếu được cung cấp với id đối tượng, với điều kiện id đối tượng đã tồn tại một cách khôn ngoan khác, nó sẽ chèn.
Nếu bạn cố sử dụng "insert" với ID đã được sử dụng trước đó trong cùng bộ sưu tập, bạn sẽ gặp lỗi khóa trùng lặp. Nếu bạn sử dụng "lưu" với một ID đã có trong cùng bộ sưu tập, nó sẽ được cập nhật / ghi đè.
Nếu bạn đang tìm kiếm một bản cập nhật thực sự, tôi sẽ đề nghị sử dụng "cập nhật". Cập nhật sẽ không ghi đè theo cách Lưu sẽ nếu bạn đang Lưu bằng cùng một ID đã có trong bộ sưu tập.
Ví dụ: bạn có hai trường "x" và "y" và bạn muốn giữ cả hai nhưng thay đổi giá trị của "x". Nếu bạn đã chọn lệnh "lưu" và không bao gồm y với giá trị trước đó hoặc hoàn toàn không có y trong lưu của bạn, thì y sẽ không còn có cùng giá trị hoặc ở đó. Tuy nhiên, nếu bạn chọn cập nhật bằng $ set và chỉ có x trong câu lệnh cập nhật, bạn sẽ không ảnh hưởng đến y.
Như bạn có thể thấy ở đây, phương thức lưu về cơ bản sẽ thực hiện một bản nâng cấp (cập nhật nếu nó tìm thấy tài liệu, chèn khác):
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
Chèn chỉ là vậy, một chèn thẳng.
Xem xét các tài liệu dưới đây
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
nếu db đã chứa tài liệu với _id: 1, thì
lưu hoạt động sẽ ném ngoại lệ như dưới đây
E11000 duplicate key error index ...........
và khi thao tác chèn, sẽ ghi đè lên tài liệu.
db.collection.save()
phương thức cập nhật tài liệu nếu một tài liệu có cùng _id đã tồn tại trong cơ sở dữ liệu. Khi một tài liệu có cùng _id đã tồn tại trong cơ sở dữ liệu, phương thức lưu sẽ thay thế hoàn toàn tài liệu bằng tài liệu mới. Từ cuốn sách- Pro MongoDB Development
db.<collection_name>.save(<Document>)
tương đương với Truy vấn insertOrUpdate.
Trong khi, db.<collection_name>.insert(<Document>)
tương đương với chỉ Chèn Truy vấn.