2013-07-27 90 views
0

我是mongodb.me的新手,我試圖在集合數組中匹配用戶名和密碼。我的樣本文檔是Mongo java在mongo數組中加上兩個或更多值

{ 
    "_id" : ObjectId("51f20148a85e39af87510305"), 
    "group_name" : "sai", 
    "users" : [ 
      { 
       "full_name" : "sumit", 
       "user_name" : "sumitdesh", 
       "password" : "mggg", 
       "status" : "Active" 
      }, 
      { 
       "full_name" : "ad", 
       "user_name" : "asd", 
       "password" : "asdf", 
       "status" : "Active" 
      }, 
} 

我試圖匹配用戶名和密碼由用戶在上述array.If用戶名,並與我們的數據密碼匹配輸入,用戶將獲得登錄。我的java代碼是

BasicDBObject u = new BasicDBObject("users.user_name", uname); 
BasicDBObject p = new BasicDBObject("users.password", password); 
f=con.coll.find(u,p); 

回答

0

您的文檔結構可能會妨礙您的工作。你如何區分用戶登錄?如果你得到一個匹配,它將返回所有用戶的整個文檔。

總之,多比較,以查詢:

BasicDBObject query = new BasicDBObject(); 
List<BasicDBObject> parts = new ArrayList<BasicDBObject>(); 
parts.add(new BasicDBObject("users.user_name", uname)); 
parts.add(new BasicDBObject("users.password", password)); 
query.put("$and", parts); 

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

您需要使用$elemMatch查詢操作。

像這樣的東西應該工作:

BasicDBObject elementQuery = new BasicDBObject("user_name", uname); 
element.put("password", password); 

BasicDBObject query = new BasicDBObject("users", 
         new BasicDBObject("$elemMatch", elementQuery); 

f=con.coll.find(query); 

羅布。

P.S.請注意 - 將單個文檔中的所有用戶都設置爲最佳狀態。您是否考慮過爲每個用戶使用用戶名和密碼分別編寫文檔?

可能表現更好的模式的一個示例是將組和用戶劃分爲兩個集合。每個用戶都會有這樣一個文件:

{ 
    "_id" : "sumitdesh", 
    "full_name" : "sumit", 
    "password" : "mggg", 
    "status" : "Active" 
    "groups" : [ "sai", "admin" ], 
} 

你可能會想索引「組」如果查詢所有的一組常成員。然後

該組文件將是這樣的:

{ 
    "_id" : "sai", 
    "permissions" : [ "read", "write_secrets" ] 
} 

指數的權限。

一種爲sumitdesh用戶讀取權限檢查則是:

db.groups.findOne( 
    { 
     _id : { "$in" : [ "sai", "admin" ] } , 
     "permissions" : "read" 
    } 
); 

請注意,數組的「在$」同組從「sumitdesh」用戶文件的陣列。

P.P.S. ...當你說密碼時,你的意思是一個哈希密碼(SHA-2?)?對?

+0

這個問題應該是什麼模式?我希望組下的用戶能夠更改組權限。 –