2015-09-09 3 views
1

Прямо сейчас в моем проекте я использую Play framework (JAVA) и Mongodb. В моей коллекции есть два поля: хэш и адрес. Обратите внимание, что поле адреса является объектом.Как избежать дублирования записи объекта в Mongodb?

Моя коллекция выглядит следующим образом:

db.hashed.find() 
{ "_id" : ObjectId("55f04cd0d4c68ef1211e6ee4"), "hash" : "1axuhWcqKB", "address" : { "floor" : 0, "block" : "5", "city" : "Mumbai", "state" : "ABC", "pincode" : 0, "latitude" : "77.6876", "longitude" : "13.57558", "hash" : "1axuhWcqKB" } } 
{ "_id" : ObjectId("55f04cd1d4c68ef1211e6ee6"), "hash" : "1ay4P407qF", "address" : { "floor" : 0, "block" : "5", "city" : "Mumbai", "state" : "ABC", "pincode" : 0, "latitude" : "77.6876", "longitude" : "13.57558", "hash" : "1ay4P407qF" } } 
{ "_id" : ObjectId("55f04cd2d4c68ef1211e6ee8"), "hash" : "1ayDn3Zemh", "address" : { "floor" : 0, "block" : "5", "city" : "Mumbai", "state" : "ABC", "pincode" : 0, "latitude" : "77.6876", "longitude" : "13.57558", "hash" : "1ayDn3Zemh" } } 

Сейчас я думаю о, как избежать дублирования записей адресов, которые, очевидно, не должны получить вставленные в базе данных. Я попытался сделать securityindex над полем адреса, но похоже, что это не то, что решит эту проблему.

> db.users.ensureIndex({"address" : 1},{unique: true}) 
{ 
"createdCollectionAutomatically" : false, 
"numIndexesBefore" : 2, 
"numIndexesAfter" : 2, 
"note" : "all indexes already exist", 
"ok" : 1 
} 

Надеюсь, кто-то может помочь мне в этом.

ответ

1

Я думаю, что проблема заключается в свойствах хэша внутри подэлементов адреса. Они различны для всех трех рядов. Вот почему mongodb не рассматривает их как дубликаты ключей. Вот мой рабочий пример (рамка Play wothout, хотя, но это не меняет точку):

import java.util.LinkedHashMap; 
import java.util.Map; 

import org.jongo.Jongo; 
import org.jongo.MongoCollection; 

import com.mongodb.DB; 
import com.mongodb.MongoClient; 

public class MongodbTest { 
    public static void main(String[] args) throws Exception { 
     String tableName = "UniqueAddressTest"; 
     DB mdb = new MongoClient("localhost:27017").getDB(tableName); 
     Jongo jdb = new Jongo(mdb); 
     MongoCollection users = jdb.getCollection(tableName); 
     users.drop(); 
     users.ensureIndex("{address:1}", "{unique:true}"); 
     Map<String, Object> user1 = new LinkedHashMap<String, Object>(); 
     Map<String, Object> address1 = new LinkedHashMap<String, Object>(); 
     address1.put("floor", 0); 
     address1.put("block", "5"); 
     address1.put("city", "Mumbai"); 
     address1.put("state", "ABC"); 
     address1.put("pincode", 0); 
     address1.put("latitude", "77.6876"); 
     address1.put("longitude", "13.57558"); 
     address1.put("hash", "1axuhWcqKB"); 
     user1.put("address", address1); 
     users.insert(user1); 
     users.insert(user1); // Here is where duplicate key exception happens 
    } 
} 

[Update] В случае, если вам нужно проверить уникальность всех полей адреса, кроме «хэша» вам нужно изменить ваш индекс во что-то вроде:

users.ensureIndex("{address.floor:1, address.block:1, address.city:1, " + 
      "address.state:1, address.pincode:1, address.latitude:1, " + 
      "address.longitude:1}", "{name:\"unique_address\", unique:true}"); 
+0

Благодарим за отзыв. Значит ли это, что я никогда не смогу проверять дубликаты на уровне базы данных, похоже, что я должен делать это только через код? Возможно, вы можете прокомментировать это: – murasing

+0

Вы можете проверить дубликаты, изменив свой индекс на что-то вроде: users.ensureIndex ("{address.floor: 1, address.block: 1, address.city:1," + \t \t "address.state: 1, address.pincode: 1, address.latitude: 1," + \t \t "address.longitude: 1}", "{имя: \" unique_address \», уникальный: истинный} «); – rsutormin

+0

Я лучше уточню свой ответ ... Сделано. – rsutormin

Смежные вопросы