Mongo java在mongo数组中加工两个或多个值

时间:2013-07-27 04:41:48

标签: java mongodb

我是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); 

2 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分: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" 
    } 
);

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

P.P.S。 ...当你说密码时你的意思是盐渍密码的哈希(SHA-2?)?正确?