2012-04-27 20 views
10

MongoDB için çok yeniyim ve Java sürücüsü ile birlikte kullanıyorum. Son satırı Ben ne yapmak istediğinizi gösteren özel ilgi konusu olanDizideki alt dokümanı DBObject (ler) olarak al

{ "_id" : ObjectId("4f7d2ba6fd5a306d82687d48"), "room" : "Den" } 
{ "_id" : ObjectId("4f7d2baafd5a306d82687d49"), "room" : "Foyer" } 
{ "_id" : ObjectId("4f7d2fdcfd5a306d82687d4a"), "room" : "Master Bedroom" } 
{ "_id" : ObjectId("4f7d301afd5a306d82687d4b"), "room" : "Guest Bedroom" } 
{ "_id" : ObjectId("4f7d2b98fd5a306d82687d47"), "code" : "A", "lights" : [ { "name" : "Overhead", "code" : "1" } ], "room" : "Kitchen" } 

: Bu belge yapıya sahiptir. Her belge bir odadır ve bir alt belgeler dizisi olan bir değere karşılık gelen "ışıklar" anahtarına sahip olabilir. Modelleme açısından, her birinde 0-n ışığı olan 0-n odaya sahip bir evim var. Java'da yapmak istediğim, bir parametre olarak odanın adını almak ve ışıklar dizisindeki alt-belgelere karşılık gelen bir DBObject koleksiyonunu döndürmek - örneğin, "bana odadaki tüm ışıkları 'mutfak' için getir” .

Şimdiye kadar, TDD tarzında kademeli geçmeden, ben bu sorguyu inşa ettik

.

public static final String ROOM_KEY = "room"; 

public static final String EQUALS_KEY = "$eq"; 

private BasicDBObject buildRoomNameQuery(String roomName) { 

    BasicDBObject myQuery = new BasicDBObject(); 
    myQuery.put(ROOM_KEY, new BasicDBObject(EQUALS_KEY, roomName)); 

    return myQuery; 
} 

bu bana geçmek oda adı için tüm oda belgeyi almak için gidiyor fark ı' Buradan devam etmenin en iyi yolunun, istediğimi elde etmesini sağlamak için biraz sıkışmıştım. Basit bir sorguyla mümkün olan şey mi yoksa diziyi geri almam ve bunları kod içinde yinelemeli, elemanları DBObject olarak mı döküyorum? Ayrıca amacım için daha iyi bir belge yapısı için önerilere de açığım - bu yapıyla hiçbir şekilde evli değilim.

Bir bakış açısı için, açıklayıcı analojiler açısından yardımcı oluyorsa, SQL ve geleneksel ilişkisel veritabanlarında oldukça iyiyim. Ayrıca, MongoDB terminolojisini keserken, lütfen beni düzeltin. Şimdiden teşekkürler.

cevap

19

Yani, böyle bir şey yapabilirsiniz:

DBCollection coll = db.getCollection("test"); 
BasicDBObject query = new BasicDBObject("room", "Kitchen"); 

// optional, limit the fields to only have the lights field 
BasicDBObject fields = new BasicDBObject("lights",1).append("_id",false); 
DBCursor curs = coll.find(query, fields); 
while(curs.hasNext()) { 
    DBObject o = curs.next(); 

    // shows the whole result document 
    System.out.println(o.toString()); 
    BasicDBList lights = (BasicDBList) o.get("lights"); 

    // shows the lights array -- this is actually a collection of DBObjects 
    System.out.println(lights.toString()); 

    // optional: break it into a native java array 
    BasicDBObject[] lightArr = lights.toArray(new BasicDBObject[0]); 
    for(BasicDBObject dbObj : lightArr) { 
    // shows each item from the lights array 
    System.out.println(dbObj); 
    } 
} 

Ayrıca Java sürücüsünde QueryBuilder kullanılması önerilir - bu biraz daha özlü DBObjects gelen Sorgular oluşturmaya daha var. Daha da iyisi, Java sürücüsünü kullanan bir nesne eşleyicisi olan Morphia'ya bakın. Doğal olarak, içinde listelere sahip varlık modellerini destekler ve DBObject öğelerini ele almak zorunda kalmadan Mongo'ya serileştirir.

+0

Teşekkür:

List<Document> comments = posts.get("comments", docClazz) 

docClazz bir kez oluşturduktan şey! Eve geldiğimde daha ayrıntılı bir bakış alacağım (işte bu kod). –

+1

QueryBuilder'ın akıcı arayüz görünümünü seviyorum ve Morphia çok güçlü görünüyor. Sanırım ne yaptığımı bildiğim kadar büyük olasılıkla QueryBuilder ve sonra Morphia'ya ilerleyene kadar kod örnekleminizde yaklaşmaya devam edeceğim. Ben her zaman "eski moda yolu" tam olarak anlamak ve kısayolu almadan önce kısayol ne olduğunu biliyorum. –

+0

DBObject'e BasicDBList veremediğinizden bu işe yaramıyor. – shreks7

1

Bahar mongo paketine bakın. Gerçekten iyi bir yolu Sen alanlar için bir yineleyici kullanabilirsiniz

1

Sen casting gerçekleştirmek ve dizeleri ile çalışmak gerekmez POJO belgeleri

http://www.springsource.org/spring-data/mongodb

kullanarak Mongo'da çalışmak için

Iterator<DBObject> fields = curs.iterator(); 
      while(fields.hasNext()){ 
       DBObject field = (DBObject) fields.next().get("lights"); 
       System.out.println(field.get("name")); 
      } 
0

Daha yeni sürümler için, Document'un kullanımını düşünün. Kendi döngü yazma ile birlikte kontrolsüz atmalarını ve linter uyarılar önlemek için, Libary en get(final Object key, final Class<T> clazz) yöntemi kullanın: işaretçileri için

final static Class<? extends List> docClazz = new ArrayList<Document().getClass(); 
İlgili konular