【问题标题】:find in MongoCollection<Document>在 MongoCollection<Document> 中查找
【发布时间】:2015-06-03 16:11:01
【问题描述】:

我有一个MongoCollection&lt;Document&gt;,我在其中分配了一个集合。 我正在尝试通过他的 id 来查找用户。

user = (Document) usersCollection.find(new Document("_id", username));

我得到一个错误

java.lang.ClassCastException: com.mongodb.FindIterableImpl 不能 转换为 org.bson.Document

当我尝试时

    BasicDBObject query = new BasicDBObject(); 
    BasicDBObject fields = new BasicDBObject("_id", username);
    usersCollection.find(query, fields);

我遇到了一个错误

MongoCollection 类型中的方法 find(Bson, Class) 不适用于参数 (BasicDBObject, BasicDBObject)

【问题讨论】:

    标签: java mongodb


    【解决方案1】:

    尝试创建一个过滤器以传递给find() 方法以获取集合中文档的子集。例如,要查找_id 字段的值为test 的文档,您可以执行以下操作:

    import static com.mongodb.client.model.Filters.*;
    
    MongoClient client = new MongoClient();
    MongoDatabase database = client.getDatabase("mydb");
    MongoCollection<Document> collection = database.getCollection("mycoll");
    Document myDoc = collection.find(eq("_id", "test")).first();
    System.out.println(myDoc.toJson());
    

    【讨论】:

    • 在哪里可以找到 eq() 运算符?
    • @DarshanPuranik import static com.mongodb.client.model.Filters.eq;
    • @DarshanPuranik eq() 是一个静态方法,在静态方法悬停时,Eclipse 不会给出导入建议。在这种情况下,您需要显式添加 import 语句以及所有其他类似方法。
    • myDoc 的类型是什么?
    • @Srikanth Document
    【解决方案2】:

    您的问题是您假设find() 方法返回单个Document。它没有。它返回它们的列表。

    在 MongoDB 2 Java 驱动程序中,DBCollection 类上有一个名为 findOne() 的方法。在 MongoDB 3 Java 驱动程序 API 中,findOne() 方法不存在。因此,您用于查找一个文档的新代码也变得与此相似:

    collection.find(eq("_id", 3)).first()
    

    eq("_id", 3) 在您的收藏中被称为过滤器。

    【讨论】:

      【解决方案3】:
      MongoCollection<Document> filterCriteriaDoc = mongoDatabase.getCollection("documentName");
      
      Document filterDoc = new Document();
      
      filterDoc.put("col1", "value");
      
      filterDoc.append("col2", "value");
      
      filterDoc.append("col2", "value");
      
      Iterator<Document> iter = filterCriteriaDoc.find(filterDoc).iterator(); 
      

      iter.next()可以给你文件。

      【讨论】:

      • 请将代码块放在栅栏之间,使其更具可读性并启用语法高亮。
      • 是的,肯定会这样做
      【解决方案4】:

      如果您在此处使用 IP 连接到 MongoDb,您将如何更改 HEREYOURIP

      导入静态 com.mongodb.client.model.Filters.eq;

      public static Document GetDocumentFromDataBase(String dataBase,String DBcollection,String field, String value) {
      MongoClient mongoClient = new MongoClient(  " HEREYOURIP ",27017 );
      MongoDatabase database =  mongoClient.getDatabase(dataBase);
      MongoCollection<Document> collection = database.getCollection(DBcollection);
      Document myDoc = collection.find(eq(field, value)).first();
          mongoClient.close();
          return myDoc;}
      

      已编辑找到了其他方法

      public static String GetFromDB(String DATABASE_NAME,String collectionName, String field, String value) {
              String valueBack;
              BasicDBObject whereQuery = new BasicDBObject();
              whereQuery.put("_id", new ObjectId(value));
              
              MongoClient mongoClient = new MongoClient(System.getenv("HERE_YOUR_DB_IP"), 27017);
              MongoDatabase database = mongoClient.getDatabase(DATABASE_NAME);
              MongoCollection<Document> collection = database.getCollection(collectionName);
              Document myDoc = collection.find(whereQuery).first();
              if (myDoc != null) {
      
                  valueBack = myDoc.toString();
                  mongoClient.close();
                  return valueBack;
              }
              mongoClient.close();
              return null;
      
          }
      

      【讨论】:

        【解决方案5】:

        这样做 -

         MongoClient client = new MongoClient();
            DBObject resultObject  = new BasicDBObject("_id", username);
            MongoDatabase database = client.getDatabase("DBNAME");
            MongoCollection<Document> collection =  database.getCollection("COLLECTION_NAME");
            DBObject dbObject  = new BasicDBObject("_id", username);
            resultObject   = collection.find(dbObject).next();
            String result =  resultObject.get(YOUR_COLOUM_NAME);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-13
          • 1970-01-01
          • 2020-02-10
          • 1970-01-01
          • 1970-01-01
          • 2018-09-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多