Mongo DB'de kaydet ve ekle arasındaki fark nedir? ikisi de aynı görünüyor
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
Mongo DB'de kaydet ve ekle arasındaki fark nedir? ikisi de aynı görünüyor
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
Yanıtlar:
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 olmazupsert : true : Yeni belge, sorgu parametreleri ve güncelleme parametreleri ile aynı içeriğe sahip oluşturulursave: 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.
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:
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 .
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.
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.
Burada görebileceğiniz gibi, kaydetme yöntemi esasen bir yükseltme yapacak (belgeyi bulursa güncelleyin, aksi takdirde ekleyin):
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
Ekleme sadece bu, düz bir uçtur.
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
db.<collection_name>.save(<Document>) InsertOrUpdate Query'ye eşdeğerdir.
While, db.<collection_name>.insert(<Document>)sadece Sorgu Ekle'ye eşdeğerdir.