我是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);
答案 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?)?正确?