2014-09-10 34 views
7

Sadece yaşadıysanız ve ben hala düşünüyorum şey hakkında sadece hızlı bir soru ile giriş $ nedenleri:MongoDB: Bir Nesne Kimliği dizisi

mongos> db.tickets.count({ "idReferenceList" : { "$in" : [ { "$oid" : "53f1f09f2cdcc8f339e5efa2"} , { "$oid" : "5409ae2e2cdc31c5aa0ce0a5"}]}}); 
mongos> db.tickets.count({ "idReferenceList" : { "$in" : [ ObjectId("53f1f09f2cdcc8f339e5efa2") , ObjectId("5409ae2e2cdc31c5aa0ce0a5")]}}); 

Ben MongoDB için tam olarak aynı nerede hem $ oid ve ObjectId yazım biçimlerini düşündüm. İlk sorgulamada neden sonuçların 0 ile sonuçlandığını ve ikincisinin 2'nin (doğru cevap) geri döndüğünü bilen var mı? Ayrıca, MongoDB ile etkileşim kurmak için MongoDB Java sürücüsünü kullanan Morphia framework'ü kullanıyorum. Ben bu kod satırları yürüterek _ID olmayan alanlar üzerinde ObjectIds dizilerde operatörü $ ile arayarak sorun var olduğu fark ettik:

List<ObjectId> fParams = new ArrayList<ObjectId>(); 

fParams.add(...); 

Query<Ticket> query = genericDAO.createQuery(); 

query.field("idReferenceList").in(fParams); 

result = genericDAO.find(query).asList(); 

önceden size çok teşekkür ederim.

Selamlar,

  • Luis Cappa
+1

genericDAO.find (sorgu) .asList(); // bunu yapabilir ve kontrol edebilir misin? ? Bu arada Wjat, this.createQuery (filtre) 'de kullandığınız filtredir. – BatScream

+0

Özür dileriz, bu sadece bir yazım hatası oldu. Bu 'createQuery' yöntemi, fParams listesi tarafından filtrelenerek bir Sorgu oluşturan bir iç yöntemdir. Kısaca, genericDAO.Find (this.createQuery (filter)), jenericDAO.find (query) ile aynıdır. Bunun için üzgünüm. – lcappa

cevap

3

Hem bu biçimler MongoDB bir nesne kimliği geçerli gösterimleri belgelerine göre olan

http://docs.mongodb.org/manual/reference/mongodb-extended-json/

ve temsil ettikleri iki modda farklı olarak,

Strict Mode   mongo Shell Mode 
    -----------   ---------------- 

    { "$oid": "<id>" } ObjectId("<id>") 

Kabuk/konsol modundan, objectid içeren alanları sorgulamak için ObjectId("<id>")'u kullanmanız gerekir. Mongo kabuk modunda izlenecek sözdizimi hangisidir.

Dolayısıyla sorgusu:

db.tickets.count({ "idReferenceList" : { "$in" : [ ObjectId("53f1f09f2cdcc8f339e5efa2") , ObjectId("5409ae2e2cdc31c5aa0ce0a5")]}}); 

size satır sayısını döndürecektir.

Şimdi

Java API aracılığıyla bunu yapmak için,

Sen olarak aşağıda yapmalıyız:

String[] ids = {"53f1f09f2cdcc8f339e5efa2","5409ae2e2cdc31c5aa0ce0a5"}; 
ObjectId[] objarray = new ObjectId[ids.length]; 

for(int i=0;i<ids.length;i++) 
{ 
    objarray[i] = new ObjectId(ids[i]); 
} 

BasicDBObject inQuery = new BasicDBObject("$in", objarray); 
BasicDBObject query = new BasicDBObject("idReferenceList", inQuery); 
DBCursor cursor = db.collection.find(query); 
while(cursor.hasNext()) 
{ 
    DBObject doc = cursor.next(); 
    // process the doc. 
} 
+0

Sorun şu ki, "_id" alanına değil, "idReferenceList" e, yani objectIds Array alan türüyle tanımlanan başka bir farklı alan için sorgulamam. Gördüğünüz gibi, işe yaramıyor ... – lcappa

+0

nesnel temsil, içinde bulunduğu alandan bağımsız olarak aynı kalır. Cevabımı günceller. _id alanına bir referans verdim. – BatScream

+0

Ama "$ oid" temsilcisi ile işe yaramıyor. Test ettin mi? Sadece iki test belgesini kabuktan kurtarın ve kendiniz deneyin. Sorun şu ki, MongoDB Java sürücüsünü kullanıyorum ve kendimi doğrudan "ObjectId" sorgu formatı ile yazamam. – lcappa