0

我是 mongodb 的新手。我正在尝试匹配集合数组中的用户名和密码。我的示例文档是

{
    "_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"
            },
}

我正在尝试匹配用户在上述数组中输入的用户名和密码。如果用户名和密码与我们的数据匹配,则用户将登录。我的java代码是

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

2 回答 2

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());
}
于 2013-07-27T04:58:40.953 回答
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); 

抢。

PS 附带说明 - 将所有用户放在一个文档中可能不是最佳选择。您是否考虑过为每个用户创建一个包含用户名和密码的单独文档?

可能表现更好的模式示例是将组和用户划分为两个集合。每个用户都会有一个文件,例如:

{
    "_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" 
    } 
);

请注意,“$in”的数组与“sumitdesh”用户文档中的组数组相同。

PPS ...当您说密码时,您的意思是加盐密码的哈希(SHA-2?)?正确的?

于 2013-07-27T04:59:14.757 回答