【问题标题】:Find some values in a mongodb collection?在 mongodb 集合中查找一些值?
【发布时间】:2012-01-09 18:59:15
【问题描述】:

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

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

现在,如果我有一个包含用户的集合:= 姓名、年龄、密码 (...) 等等。现在我想找一个有密码的名字。例如登录过程。假设我有两个字符串:字符串 n 和 p。如果数据库中有 user.equals(n) 和 password.equals(p) 则登录用户。如何更改光标?我在mongodb java教程页面上看到了一些查询示例,但是我真的不明白...

有什么想法吗?谢谢

【问题讨论】:

    标签: java mongodb collections nosql


    【解决方案1】:

    您可以直接查询所需的数据:

    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() 方法返回的结果计数,以确保只有一条记录与您的查询匹配。

    【讨论】:

    • 技术上正确,但我觉得确实应该只有一个用户/密码与查询匹配(while 循环建议很多),并且代码表明密码以纯文本形式存储,初学者可能认为这是理所当然的。如何安全地存储密码肯定不是 OP 的重点,但我认为我们应该注意不要在答案中有不良做法。
    • 为什么不直接使用 findOne 并像我的示例中那样处理光标?
    • @Tyler Brock findOne() 不保证集合中有一个用户,它只会返回第一个匹配项。
    • 当然,通常这是您想要的行为。如果有人正在登录并且没有匹配,则为错误,如果匹配多个,则也为错误。
    • 如果集合中有多个匹配项,我不确定 findOne() 是否返回错误?
    【解决方案2】:

    太棒了,你会喜欢 Mongo 的。

    在您发布的示例中,程序遍历了一组结果。在用户/密码问题中,您描述了您实际尝试做的是根据某些标准获取一个文档(而不是一组文档)。

    在外壳上看起来像这样:

    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)
    

    and... 而不是 while 循环,只需使用 findOne 而不是 find,这样您就不必遍历 1 个对象的结果集(毫无意义)。

    您可以阅读有关 findOne() here 的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2014-04-13
      • 1970-01-01
      • 2016-04-26
      • 2018-01-30
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多