在MongoDB集合中查找一些值?

4

我正在尝试使用Java读取(mongo)用户数据库。在教程页面上,我看到了如何读取整个集合的方法。我可以像这样做:

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

现在,假设我有一个用户集合,其中包括name、age、password等信息。我希望能够通过密码查找到对应的用户名,例如在登录过程中。假设我有两个字符串:String n和p。如果数据库中有一个用户的用户名等于n,并且该用户的密码等于p,则允许用户登录。我该如何更改游标呢?我在mongodb java教程页面上看到了一些查询示例,但我真的不是很懂…

有任何想法吗?谢谢。

2个回答

7

太好了,你会喜欢Mongo。

在你发布的示例中,程序遍历一组结果。而在你所描述的用户名和密码问题中,实际上您想要做的是基于某些条件获取一个文档(而不是一组文档)。

在shell中,它看起来像这样:

n = "login"
p = "password"

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

注意,我使用的是findOne而不是find,它返回一个文档而不是多个文档的游标。
现在,让我们来看看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)

改用findOne,而不是while循环中的find,这样您就不必迭代1个对象的结果集(毫无意义)。

您可以在此处了解更多关于findOne()的信息。


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
为什么不直接使用findOne,而不像我的示例那样处理游标呢? - Tyler Brock
@Tyler Brock findOne()方法并不能保证集合中只有一个用户,它只会返回第一个匹配项。 - ioseb
1
当然,通常这是您想要的行为。如果有人正在登录并且没有匹配项,则会出现错误,如果有多个匹配项,则也会出现错误。 - Tyler Brock
我不确定findOne()在集合中有多个匹配项时是否会返回错误? - ioseb
哦,也许你是对的。很酷。我个人从未使用过Java驱动程序。 - Tyler Brock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接