Sự khác biệt giữa lưu và chèn trong Mongo DB là gì?


Câu trả lời:


146

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 _idtrườ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 :

updatesử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 upsertxuấ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ại
  • upsert : 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ật

save: Không cho phép bất kỳ thông số truy vấn nào. nếu _idtồ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.


8
Cả hai đều có cú pháp khác nhau. Cập nhật có nhiều đối số ({condition}, {update to doc}, upsert, multi) trong khi lưu chỉ chấp nhận một đối số (_id là tham số cho đối số có điều kiện) .update có thể chấp nhận bất kỳ điều kiện nào nhưng lưu chỉ có giới hạn điều kiện trên _id lĩnh vực.
Rahul

1
Kể từ phiên bản 2.6, save có một đối số thứ hai lấy một tài liệu thể hiện mối quan tâm ghi. docs.mongodb.org/manual/reference/method/db.collection.save
huggie

77

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:       

10
Sơ đồ cấp độ tiếp theo
John Spiteri

2
Nâng cao thời gian thực hiện để vẽ gọn gàng và trình bày sơ đồ.
fanbondi

36

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ó _idtrường.


13

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.


10

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.



3

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
jack trống

1

Về mặt ORACLE: mongo insert => Oracle insert mongo save => Oracle merge


1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.