2013-07-26 15 views
10

MongoDB için yeni. Benim örnek belge Kimin "url" : "www.adf.com" Bildirimi güncellemeye çalışıyorumMongoDB öğesinde dizi öğelerini belge üzerinde sorgula Java kullanarak

{ 
    "Notification" : [ 
     { 
      "date_from" : ISODate("2013-07-08T18:30:00Z"), 
      "date_too" : ISODate("2013-07-30T18:30:00Z"), 
      "description" : "fdfd", 
      "url" : "www.adf.com" 
     }, 
     { 
      "date_from" : ISODate("2013-07-01T18:30:00Z"), 
      "date_too" : ISODate("2013-07-30T18:30:00Z"), 
      "description" : "ddddddddddd", 
      "url" : "www.pqr.com" 
     } 
    ], 

olduğunu. Bunu yapmak için My Java kodu: Bu kimin "url""www.adf.com" olan belgenin aramaz

BasicDBObject query=new BasicDBObject("url","www.adf.com"); 

DBCursor f = con.coll.find(query); 

.

+0

'con.coll' nedir? –

+0

con bağlantı nesnesi –

+0

ve 'coll' nedir? –

cevap

13

Bu durumda yuvalanmış bir belgeniz var. Belgenizde, url alanıyla birden çok alt nesneyi saklayan bir dizi olan Notification numaralı bir alan vardır. Ancak

BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com"); 

Bu irade bütün Notification dizisi ile bütün belgesi döndürür: bir alt alanda aramak için, nokta-sözdizimi kullanmanız gerekir. Büyük ihtimalle sadece alt belgeyi istiyorsun. Bunu filtrelemek için the two-argument version of Collection.find'u kullanmanız gerekir.

The .$ means "only the first entry of this array which is matched by the find-operator"

Bu

BasicDBObject query=new BasicDBObject("Notification.url","www.example.com"); 
BasicDBObject fields=new BasicDBObject("Notification.$", 1); 

DBCursor f = con.coll.find(query, fields); 

hala alt-dizide Notifications ile bir belgeyi dönmelidir, ancak bu dizi sadece girişini url == "www.example.com" içermelidir.

Java ile bu belgeyi çapraz için şunu yapın:

BasicDBList notifications = (BasicDBList) f.next().get("Notification"); 
BasicDBObject notification = (BasicDBObject) notifications.get(0); 
String url = notification.get("url"); 

arada: veritabanı Bu sorguyu hızlandırmak için bir dizin yarat sürece büyük olasılıkla, performans sorunlarla çalışacak büyüdüğünde:

con.coll.ensureIndex(new BasicDBObject("Notification.url", 1)); 
+0

"url" dosyasına erişmeyi denediğimde yukarıdaki sorguya göre ayrılmış String s = (String) f.curr(). Get ("url"); –

+0

@PrashantThorat null değerini döndürür. Bunun nedeni, döndürülen belgenin 'url' alanı içermemesidir. Muhtemelen bir alan 'url' içeren bir DBObject içeren bir DBList içeren bir 'Bildirimler' alanı vardır. Hata ayıklayıcısında kontrol edin. – Philipp

+0

@PrashantThorat 'f.curr(). Get (" Bildirimler "). Get (0) .get (" url ")' işe yarayabilir. – Philipp

İlgili konular