2011-11-30 96 views
3

我試圖用java讀取(mongo)userdatabase。在教程頁面上,我看到了如何閱讀整個集合。我可以做這樣的事情:在mongodb集合中查找一些值?

DBCursor cursor = col.find(); 
    while (cursor.hasNext()) { 
     System.out.println(cursor.next()); 
    } 

現在,如果我有一個用戶的集合:=姓名,年齡,密碼(...),並不管。現在我想找一個帶有密碼的名字。例如對於登錄過程。可以說我有兩個字符串:String n和p。如果數據庫中存在user.equals(n)和password.equals(p),則登錄用戶。我該如何改變光標?我看到MongoDB的Java教程頁面上某些查詢的例子,但咄我真的不明白......

任何想法?謝謝

回答

7

太棒了,你會愛上蒙戈。

在您發佈的示例中,程序會遍歷一組結果。在用戶/密碼問題中,您描述了您實際嘗試執行的操作是根據某些條件獲取一個文檔(而不是一組文檔)。

在外殼上,將是這樣的:我使用的,而不是findOne

n = "login" 
p = "password" 

db.users.findOne({ user: n, password: p}) 

公告發現它返回一個文檔,而不是光標到許多文件。

現在,讓我們來看看在Java驅動程序的例子:

BasicDBObject query = new BasicDBObject(); 

query.put("i", 71); 
cur = coll.find(query); 

while(cur.hasNext()) { 
    System.out.println(cur.next()); 
} 

的BasicDBObject創建查詢對象,然後你把它們共同構成查詢不同的標準。

所以不是query.put("i", 71);你會做這樣的事情:

query.put("user", n) 
query.put("password", p) 

和...而不是while循環只是用findOne,而不是找到,所以你不必遍歷結果集的1對象(毫無意義)。

你可以閱讀更多關於findOne()here

3

可以直接查詢所需要的數據:

BasicDBObject query = new BasicDBObject(); 
query.put("name", "user"); 
query.put("password", "[YOUR ENCRYPTED PASSWORD HERE]"); 

DBCollection collection = db.getCollection("yourcollectionname"); 
DBCursor cursor = collection.find(query); 

while (cursor.hasNext()) { 
    //do something with cursor.next(); 
} 

正如有人建議你需要檢查由find()方法返回,以確保只有單個記錄您的查詢相匹配的結果計數。

+2

從技術上講是正確的,但我覺得真的應該只有一個用戶/密碼與查詢匹配(在'while'環說明很多),以及代碼表明,密碼存儲在純文本,這初學者可以採取理所當然。 OP如何安全地存儲密碼當然不是重點,但我認爲我們應該小心,不要在答案中出現不好的做法。 – mnemosyn

+0

感謝您指點!我更新了我的評論。 – ioseb

+0

爲什麼不只是使用findOne並且不要像在我的例子中那樣處理光標? –