2013-01-14 23 views
10

我必須寫一個簡單的MongoDB查詢使用java但我不能做到這一點。如何使用java來做這個MongoDB查詢?

蒙戈查詢看起來是這樣的:

db.yourCollection.find({"$where" : "this.startDate < this.endDate"}) 

我必須使用QueryBuilder類寫上面的查詢。但我無法在MongoDBjava驅動程序中做到這一點。

BasicDBObject document = new BasicDBObject(); 
document.put("id", 1001); 
document.put("intValue", 1200); 
document.put("updateValue", 2100); 

DBObject query = QueryBuilder.start("intValue").lessThan("updateValue").get(); 
DBCursor cursor = collection.find(query); 
while (cursor.hasNext()) { 
System.out.println("Result : -"+cursor.next());} 

上述代碼不返回任何結果。但如果更改爲updateValue2100它給出的結果。我的問題是lessThan以對象作爲輸入參數。那我該如何將文檔字段作爲輸入參數?

回答

11

理想的情況下你的MongoDB的查詢應該是這樣的: -

db.yourCollection.find({"startDate": {$lt: endDate}}) 

可以用Java編寫這樣的: -

BasicDBObject query = new BasicDBObject("startDate", new BasicDBObject("$lt", endDate); 
DBCursor cursor = coll.find(query); 

你可以看看Official Tutorial


如果你想使用QueryBuilder,你可以這樣做: -

DBObject query = QueryBuilder.start("startDate").lessThan("endDate").get(); 
DBCursor cursor = coll.find(query); 
+0

以上查詢生成器不起作用。如果「endDate」是同一文檔中的一個字段。它正在工作,如果我在QueryBuilder中給定常量值而不是endDate。此外,BasicDBObject不接受第二個參數中的endDate字段名稱 – zulu

4

QueryBuilder幫助構造複雜的查詢以從mongo數據庫中的集合中檢索數據。 您可以像這樣使用QueryBuilder。

BasicDBObject document = new BasicDBObject(); 
QueryBuilder qb = new QueryBuilder(); 
qb.or(new QueryBuilder().put("starting_date").is(null).put("ending_date").is(null).get(), 
       new QueryBuilder().put("starting_date").lessThanEquals("ending_date").get()); 
document.putAll(qb.get()); 
DBCursor cursor = getDbCollection().find(document) 
  • QueryBuilder的QB =新的QueryBuilder(),實例化新的QueryBuilder。
  • 在上面的例子中,QueryBuilder的邏輯構建是; (開始日期= null和結束日期= null)或(開始日期< =結束日期)
  • document.putAll(qb.get())將構造的邏輯添加到DBObject中。