2014-09-10 17 views
7

Wystarczy szybkie pytanie o czymś Właśnie doświadczyłem i ja wciąż myśleć o tym, dlaczego:

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

Myślałem, że oba formaty pisowni $ oid i ObjectId są dokładnie takie same dla MongoDB. Czy ktoś wie, dlaczego z pierwszym zapytaniem zwraca 0 wyników, a drugi zwraca 2 (odpowiednia odpowiedź)?

Ponadto używam architektury Morphia, która używa sterownika Java MongoDB do interakcji z MongoDB. Zdałem sobie sprawę, że istnieje problem poprzez wyszukiwanie za pomocą $ w operatora w macierzach ObjectIds nad polami, które nie są _id poprzez wykonanie tej linii kodu:

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

fParams.add(...); 

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

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

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

Dziękuję bardzo z góry.

Pozdrawiam,

  • Luis Cappa
+1

genericDAO.find (zapytanie) .asList(); // możesz to zrobić i sprawdzić. ? Wjat jest przy okazji filtrem, którego używasz w this.createQuery (filter). – BatScream

+0

Niestety, był to tylko błąd literówki. Ta metoda "createQuery" jest wewnętrzną metodą, która tworzy zapytanie przez filtrowanie według listy fParams. Krótko mówiąc, genericDAO.Find (this.createQuery (filter)) jest taki sam jak genericDAO.find (zapytanie). Przepraszam za to. – lcappa

Odpowiedz

3

Oba te formaty są poprawne reprezentacje identyfikatorem obiektu w MongoDB, zgodnie z dokumentacją,

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

i one reprezentowane inaczej w dwóch trybach,

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

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

Tak więc, aby wypytać pola zawierające objectid, z trybu powłoki/konsoli, należy użyć ObjectId("<id>"). Jaka jest składnia, której należy przestrzegać w trybie powłoki Mongo.

Stąd zapytania:

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

wróci liczyć wierszy.

Teraz to zrobić za pośrednictwem interfejsu API Javy,

Trzeba to zrobić jak poniżej:

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

Chodzi o to, że nie wysyłam zapytania do pola "_id", ale do "idReferenceList", które jest innym, innym polem zdefiniowanym za pomocą typu pola Array of objectIds. Jak widać, To nie działa ... – lcappa

+0

Reprezentacja obiektu jest taka sama, niezależnie od pola, w którym się znajduje. Zaktualizuje moją odpowiedź. Właśnie podałem odniesienie do pola _id. – BatScream

+0

Ale z reprezentacją "$ oid" To nie działa. Testowałeś to? Po prostu zapisz dwa dokumenty testowe przez powłokę i spróbuj sam. Problem polega na tym, że używam sterownika Java w MongoDB i nie mogę sam przeliterować bezpośrednio formatu zapytania "ObjectId". – lcappa