Mongo DB Ve Java Temel İşlemler 4 - Kayıt Güncelleme
Önceki 3 yazımızda MongoDB veritabanımıza Java ile nasıl kayıt girileceği ve kayıt çekileceği işlemlerini öğrenmiştik. Bu yazıda da mevcut verinin nasıl güncellenebileceğine değineceğiz.
Üzerinde update işlemi uygulayacağımız örnek Bson’larımızdan birisi şu arkadaşlar:
{
"_id": "57c19b523e9b4210f7353280",
"address": {
"street": "2 Avenue",
"zipcode": "10078",
"building": "1480",
"coord": [
-73.9557413,
40.7720266
]
},
"borough": "Manhattan",
"cuisine": "Russian",
"grades": [
{
"date": "27-08-2016",
"grade": "A",
"score": 16
},
{
"date": "27-08-2016",
"grade": "B",
"score": 17
}
],
"name": "Vella",
"restaurant_id": "41704620"
}
Biz şimdi update kodumuzda borough alanını St.Petersburg olarak güncelleyeceğiz. Güncelleme kodumuz şöyle:
package io.github.ilkgunel.mongodb;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
public class MongoDBUpdateRecords {
public static void main(String[] args){
MongoClient mongoClient=null;
try {
mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("MongoDB");
database.getCollection("Records").updateOne(new Document("cuisine","Russian"),
new Document("$set",new Document("borough","St.Petersburg")));
} catch (Exception e) {
System.out.println("An Error Occured! Error is:"+e);
}
finally{
mongoClient.close();
}
}
}
Kod içerisinde database.getCollection(“Records”) diyerek Records collection’ını elde ediyoruz ve updateOne metodu ile bir kaydı güncelleyeceğimizi söylüyoruz. updateOne metoduna iki parametre veriyoruz. Birinci parametre bizim şartımızı bildiriyor. Bir döküman parametresi geçirerek cuisine alanı Russian olan kayıt üzerinde güncelleme yapılacak diyoruz. Burda trick bir nokta var. Birden fazla cuisine alanı Russian olan kayıt varsa ilk karşılaşılan kayıt üzerinde güncelleme yapılır, diğer kağıtlara dokunulmaz. updateOne matoduna verdiğimiz ikinci parametre yine bir döküman. Bu dökümanda key alanına $set operatörü ataması yapıyoruz. Bu operatör SQL’deki Update komutundaki Set gibi çalışarak value alanındaki döküman ile güncelleme yapıyor. updateOne metoduna verdiğimiz ikinci parametrenin value alanı da yine bir döküman ve bu dökümanda da key alanına güncellenecek alanı, value alanına güncellenecek değeri veriyoruz.
İşlemin neticesinde MongoClient üzerinden baktığımızda güncellemenin başarılı olduğunu görüyoruz.
Yukarıdaki güncelleme işlemi kaydın doğrudan bir alanına yönelikti. Biz bir de bir alanın altındaki alanı güncelleyebiliriz. Örneğin yukarıdaki BSON üzerinde address alanı altındaki building alanını güncelleyelim ve bunun için şu kodu kullanalım. Bu arada MongoDB’nin dökümantasyonunda bu alanlara yani bir alanın içine açılmış alt alanların barındığı kısıma Embedded Document deniyor.
database.getCollection("Records").updateOne(new Document("cuisine", "Russian"),
new Document("$set", new Document("address.building", "1481")));
Kodda az önce yaptığımızdan bir fark yok. Sadece daha önce de gördüğümüz gibi iç içe alanlar için “.” operaötürnü kullanarak ulaşıyoruz. Kodu çalıştırıp MongoClient’a baktığımızda kaydın ilgili alanının başarılı bir şekilde güncellendiğini görebiliyoruz.
Bu kısıma kadar tek kayıt güncellemeye yarayan updateOne metodunu gördük. Birden fazla kayıt güncellemek istediğimizde ise updateMany metodunu kullanmamız gerekiyor. Üzerinde update işlemi gerçekleştireceğimiz iki BSON’a şöyle bakalım:
{
"_id": "57c19b523e9b4210f7353281",
"address": {
"street": "2 Avenue",
"zipcode": "10079",
"building": "1480",
"coord": [
-73.9557413,
40.7720266
]
},
"borough": "Manhattan",
"cuisine": "Italian",
"grades": [
{
"date": "27-08-2016",
"grade": "A",
"score": 18
},
{
"date": "27-08-2016",
"grade": "B",
"score": 19
}
],
"name": "Vella",
"restaurant_id": "41704620"
}
{
"_id": "57c19b523e9b4210f735327e",
"address": {
"street": "2 Avenue",
"zipcode": "10076",
"building": "1480",
"coord": [
-73.9557413,
40.7720266
]
},
"borough": "Manhattan",
"cuisine": "Italian",
"grades": [
{
"date": "27-08-2016",
"grade": "A",
"score": 12
},
{
"date": "27-08-2016",
"grade": "B",
"score": 13
}
],
"name": "Vella",
"restaurant_id": "41704620"
}
Az önce de söylediğim gibi updateOne metodu kendisine verilen şarta göre ilk bulduğu kayıt üzerinde update yapar. Yukarıdaki kayıtların cuisine alanları aynı değerleri taşıyorlar. Bu şartı updateMany metoduna verdiğimiz zaman aynı şartı taşıyan tüm kayıtlara update uygulanacak. Örnek kodumuz şöyle:
database.getCollection("Records").updateMany(new Document("cuisine", "Italian"),
new Document("$set", new Document("borough", "Sicily")));
Kodumuz cuisine alanı Italian olan tüm kayıtları bulacak ve akabinde borough alanlarını Sicily olarak güncelleyecek.
Kodu çalıştırdığımızda ilgili kayıtlar başarı ile güncelleniyor.
Bunların yanında bir de döküman değiştirme metodu kütüphane içerisinde yer alıyor. replaceOne adındaki metot ile mevcut kaydın tek seferde yeni bir kayıt ile değiştirilmesini sağlayabiliriz. Şimdi şu kayıt üzerinde replaceOne metodunu uygulayalım. Burada ayırt edici alan olarak yine cuisine alanını kullanabiliriz.
{
"id": "57c1991a3e9b4210c9d291c9",
"address": {
"street": "2 Avenue",
"zipcode": "10075",
"building": "1480",
"coord": [
-73.9557413,
40.7720266
]
},
"borough": "Manhattan",
"cuisine": "Turkish",
"grades": [
{
"date": "27-08-2016",
"grade": "A",
"score": 10
},
{
"date": "27-08-2016",
"grade": "B",
"score": 11
}
],
"name": "Vella",
"restaurant_id": "41704620"
}
Şimdi bu kayıt üzerinde replaceOne metodunu kullanarak kaydı değiştirme işlemini uygulayalım:
package io.github.ilkgunel.mongodb;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import static java.util.Arrays.asList;
import java.util.Date;
import java.util.Locale;
import org.bson.Document;
public class MongoDBUpdateRecords {
public static void main(String[] args) {
MongoClient mongoClient = null;
DateFormat format = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
try {
mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("MongoDB");
database.getCollection("Records").replaceOne(new Document("cuisine", "Turkish"),
new Document("address",
new Document()
.append("street", "Samsun Sinop Yolu")
.append("zipcode", "5255")
.append("building", "5255")
.append("coord", asList(-73.9557413, 40.7720266)))
.append("borough", "Ünye")
.append("cuisine", "Turkish")
.append("grades", asList(
new Document()
.append("date", format.format(new Date()))
.append("grade", "A")
.append("score", 11),
new Document()
.append("date", format.format(new Date()))
.append("grade", "B")
.append("score", 17)))
.append("name", "Cabbar Usta")
.append("restaurant_id", "41704620"));
} catch (Exception e) {
System.out.println("An Error Occured! Error is:" + e);
} finally {
mongoClient.close();
}
}
}
Kodun çalıştırılması neticesinde kayıt şu hale geliyor:
ReplaceOne metodunda bir püf nokta bulunuyor arkadaşlar. Bu metot güncellemeden ziyade değiştirme işlemi uyguladığından ilgili şarta uyan kayıt silinerek yerine gönderilen döküman girilir. Bu nedenle replaceOne metodu ile güncelleme yapmamaya çalışmamak önemlidir çünkü mevcut verileriniz silinebilir ve kaydı tamamen bozabilirsiniz. Şimdi bu durumu da örnekleyelim. Yukarıdaki kodu şu şekilde değiştirelim:
public static void main(String[] args) {
MongoClient mongoClient = null;
DateFormat format = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
try {
mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("MongoDB");
database.getCollection("Records").replaceOne(new Document("cuisine", "Turkish"),
new Document("address",
new Document()
.append("street", "Samsun Sinop Yolu")
.append("zipcode", "5255")
.append("building", "5255")
.append("coord", asList(-73.9557413, 40.7720266)))
.append("borough", "Ünye")
.append("cuisine", "Turkish")
.append("name", "Cabbar Usta")
.append("restaurant_id", "41704620"));
} catch (Exception e) {
System.out.println("An Error Occured! Error is:" + e);
} finally {
mongoClient.close();
}
}
Önceki koddaki grades alanını ve altında tuttuğu alanları çıkardık. Şimdi kodumuzu çalıştıralım ve kaydın durumuna bakalım:
Ekran çıktısında gördüğümüz gibi grades alanı mevcut kayıt içinden kabyboldu çünkü eski kayıt silinerek koddaki yeni kayıt girildi.
Bu yazıda da bu kadar arkadaşlar. Gelecek yazıda görüşene kadar sağlıcakla kalın.
Selam ve Sevgilerimle