2013-06-22 63 views
0

我有一個這樣的樹蒙戈:MongoDB的樹找到後裔的Java

> db.data.find() 
{ "_id" : "07c", "path" : null } 
{ "_id" : "a", "path" : "07c,a" } 
{ "_id" : "b", "data" : "{\"c\":\"olaC\",\"d\":\"olaD\"}", "path" : "07c,a,b" } 
{ "_id" : "c", "c" : "{\"c\":\"olaC\",\"d\":\"olaD\"}", "path" : "07c,a,b,c" } 
{ "_id" : "d", "d" : "{\"d\":\"olaD\"}", "data" : "{\"c\":\"olaC\",\"d\":\"olaD\"}", "path" : "07c,a,b,c,d" } 

我想檢索B的所有後代。

如果我這樣做是MongoDB的控制檯,我得到的後代精:

> db.data.find({ path: /,b,/ }) 
{ "_id" : "c", "c" : "{\"c\":\"olaC\",\"d\":\"olaD\"}", "path" : "07c,a,b,c" } 
{ "_id" : "d", "d" : "{\"d\":\"olaD\"}", "data" : "{\"c\":\"olaC\",\"d\":\"olaD\"}",  "path" : "07c,a,b,c,d" } 

,但如果我這樣做在Java中:

BasicDBObject query = new BasicDBObject(); 
query.put("path", "/,"+array[i]+",/"); 
DBCursor cursor = coll.find(query); 
while(cursor.hasNext()){ 
    System.out.println(cursor.next().toString()); 
} 

從調試器查詢中包含這樣的:{ 「path」:「/,b,/」}

我根本沒有後代...爲什麼這不起作用?

http://docs.mongodb.org/manual/tutorial/model-tree-structures-with-materialized-paths/

+0

試試這個:query.put( 「路徑」,Pattern.compile( 「/」 +陣列[I] + 「/」)); –

回答

1

/../是MongoDB的shell特殊。它不是簡單的包含正則表達式的字符串,而是由shell解析並用作正則表達式的東西。

從Java做到這一點,你會做這樣的事情:

BasicDBObject query = new BasicDBObject(); 
query.put("name", Pattern.compile(","+array[i]+",")); 
DBCursor cursor = coll.find(query); 
while(cursor.hasNext()){ 
    System.out.println(cursor.next().toString()); 
} 

參見:How to query mongodb with 「like」 using the java api?

+0

你和@Abhishek庫馬爾非常接近。我確實不得不變成一種模式,但不需要把昏迷和斜線: query.put(「path」,Pattern.compile(array [i])); 這工作得很好,謝謝你的幫助。 – HeWhoCodes

+0

如果你想確保它只匹配部分,你需要逗號,否則compile(「c」)也會匹配「abcdef」,而不僅僅是「b,c,d」。我建議你在路徑字符串元素的任一側總是有一個。 – Derick