Mongo DB'de kaydet ve ekle arasındaki fark nedir?


Yanıtlar:


150

Vs Ekle'yi Kaydet:

Verdiğiniz örneklerde, davranış esasen aynıdır.

save "_id" parametresiyle geçirilirse farklı davranır.

Kaydetmek için, eğer belge içeriyorsa _id, _idalandaki koleksiyon sorgusunu yukarı kaldıracak , yoksa ekleyecektir.

Belirtilen _id değerine sahip bir belge yoksa, save () yöntemi belgedeki belirtilen alanlarla bir ekleme gerçekleştirir.

Belirtilen _id değerine sahip bir belge mevcutsa, save () yöntemi, mevcut kayıttaki tüm alanı belgedeki alanlarla değiştirerek bir güncelleme gerçekleştirir.


Güncellemeye karşı Kaydet :

updatesorgu parametrelerinizle eşleşen mevcut bir belgeyi değiştirir. Eşleşen böyle bir belge yoksa, o zaman upsertortaya çıkar.

  • upsert : false : Böyle bir belge olmadığında hiçbir şey olmaz
  • upsert : true : Yeni belge, sorgu parametreleri ve güncelleme parametreleri ile aynı içeriğe sahip oluşturulur

save: Sorgu parametrelerine izin vermez. eğer _idvarsa ve bir eşleştirme doc aynı olan var _id, onu değiştirir. _İd belirtilmediğinde / eşleşen belge olmadığında, belgeyi yeni olarak ekler.


8
her ikisinin de farklı sözdizimi vardır. Güncelleme birden çok bağımsız değişken alır ({koşul}, {belgeye güncelle}, upert, multi), oysa save yalnızca bir bağımsız değişkeni kabul eder (_id koşullu bağımsız değişkenin parametresidir). Güncelleme herhangi bir koşulu kabul edebilir, ancak kaydetme yalnızca koşul sınırlamasına sahiptir _id alanı.
Rahul

1
2.6 sürümünden itibaren, kaydetme, yazma sorununu ifade eden bir belgeyi alan ikinci bir argümana sahiptir. docs.mongodb.org/manual/reference/method/db.collection.save
huggie

83

Kurtarmak için buradaki iki durumu ele alalım: -

1) doc'ta _id'ye sahip olmak.

2) Dokümanda _id olmaması.

                        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.

Eklemek için buradaki iki durumu ele alalım: -

1) Koleksiyonda _id of doc olması.

2) Koleksiyonda _id of doc olmaması.

                        Insert()
                       /        \
                      /          \

   Doc Having _id in collection    Doc Not Having _id 
  ->  E11000 duplicate key     ->Insert a new doc inside the collection.
      error index:       

12
Sonraki seviye diyagramları
John Spiteri

3
Diyagramları düzgün bir şekilde çizmek ve sunmak için geçen süre için oy verildi.
fanbondi

37

save bir belge ekleyin veya güncelleyin.

insert sadece bir ekleme yapar.

Ancak sizin durumunuzda, kaydetmede sağlanan belgede _idalan olmadığı için aynı şeyi yapacaktır .


13

Bir örnek vererek

Apple kaydedin

db.fruit.save({"name":"apple", "color":"red","shape":"round"})
WriteResult({ "nInserted" : 1 })

db.fruit.find();

{
    "_id" : ObjectId("53fa1809132c1f084b005cd0"),
    "color" : "red",
    "shape" : "round",
    "name" : "apple"
}

_İd ile önceden kaydedilmiş elma kaydetme

db.fruit.save(
{"_id" : ObjectId("53fa1809132c1f084b005cd0"),"name":"apple", 
"color":"real red","shape":"round"})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Şimdi kaydettiğimiz elmanın rengi kırmızıdan gerçek kırmızıya güncellendi

db.fruit.find();
{
    "_id" : ObjectId("53fa1809132c1f084b005cd0"),
    "color" : "real red",
    "shape" : "round",
    "name" : "apple"
}

_İd ile bir elma kaydedin

db.fruit.save({"_id" : ObjectId("55551809132c1f084b005cd0"),
"name":"apple", "color":"real red","shape":"round"})

    WriteResult({ "nMatched" : 0, "nUpserted" : 1, 
"nModified" : 0, "_id": 55551809132c1f084b005cd0 })

Güncelleme yapmak için aynı Nesne Kimliğine sahip elma olmadığı için Apple takıldı

Turuncu ekle

db.fruit.insert({"name":"orange", "color":"orange","shape":"round"})
WriteResult({ "nInserted" : 1 })

Turuncu eklendi

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"
}

Bu nedenle, nesne kimliği zaten mevcutsa, başka bir şekilde bir ekleme yapması koşuluyla, bir nesne kimliği sağlanmışsa, bir güncelleme işlevi görür.


10

Aynı koleksiyonda daha önce kullanılmış bir kimlikle "ekle" yi kullanmaya çalışırsanız, yinelenen bir anahtar hatası alırsınız. Zaten aynı koleksiyonda bulunan bir kimlikle "kaydet" kullanırsanız, güncellenecek / üzerine yazılacaktır.

Gerçek bir güncelleme yapmak istiyorsanız, "güncelleme" yi kullanmanızı öneririm. Halihazırda koleksiyonda bulunan kimliği kullanarak Kaydediyorsanız, Kaydet'in yapacağı şekilde güncelleme üzerine yazmayacaktır.

Örneğin, "x" ve "y" olmak üzere iki alanınız var ve ikisini de tutmak, ancak "x" değerini değiştirmek istiyorsunuz. "Kaydet" komutunu seçtiyseniz ve önceki değerle y'yi eklemediyseniz veya kaydınızda hiç y yoksa, y artık aynı değere sahip olmayacak veya orada olmayacaktır. Ancak, $ set kullanarak güncellemeyi seçtiyseniz ve güncelleme ifadenizde yalnızca x varsa, y'yi etkilemezsiniz.



3

Aşağıdaki belgeyi düşünün

{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }

db, _id: 1 olan dokümanı zaten içeriyorsa, o zaman

kaydetme işlemi aşağıdaki gibi istisnayı atacak

E11000 duplicate key error index ...........

ve ekleme işlemi olarak, sadece belgeyi geçersiz kılacaktır.


db.collection.save()yöntem, veritabanında aynı _id'ye sahip bir belge zaten varsa belgeyi günceller. Aynı _id'ye sahip bir belge veritabanında zaten mevcutsa, kaydetme yöntemi belgeyi tamamen yeni belgeyle değiştirir. Kitaptan- Pro MongoDB Development
jack blank

1

ORACLE açısından: mongo insert => Oracle insert mongo save => Oracle birleştirme


1

db.<collection_name>.save(<Document>) InsertOrUpdate Query'ye eşdeğerdir.

While, db.<collection_name>.insert(<Document>)sadece Sorgu Ekle'ye eşdeğerdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.