首页 文章

MongoDB:使用Java驱动程序查询ObjectId

提问于
浏览
2

使用MongoDB和Java驱动程序,我有一个集合 users ,我想根据它们的ObjectId进行查询(大图:我从ObjectId推断到对象的创建时间戳) .

问题是,查询 ObjectId 似乎不起作用:我总是得不到任何结果 . 出于测试目的,我在搜索查询中硬编码了数据库中现有用户的ObjectId,以确保我得到结果:

{“_ id”:ObjectId(“565ef85ee4b0a4db3c2fc96b”),...}

不过,我从来没有得到任何结果 .

这些是我尝试构建查询的方式,以及创建的查询的打印输出:

1 .

BasicDBObject query = new BasicDBObject();
query.put("_id", "565ef85ee4b0a4db3c2fc96b");

查询: { "_id" : "565ef85ee4b0a4db3c2fc96b"}

2 .

BasicDBObject query = new BasicDBObject();
query.put("_id", new ObjectId("565ef85ee4b0a4db3c2fc96b"));

查询: { "_id" : { "$oid" : "565ef85ee4b0a4db3c2fc96b"}}

3 .

BasicDBObject query = new BasicDBObject("_id", "565ef85ee4b0a4db3c2fc96b");

查询: { "_id" : "565ef85ee4b0a4db3c2fc96b"}

4 .

BasicDBObject query = new BasicDBObject("_id", new ObjectId("565ef85ee4b0a4db3c2fc96b"));

查询: { "_id" : { "$oid" : "565ef85ee4b0a4db3c2fc96b"}}

5 .

DBObject query = new BasicDBObject("_id", 
        BasicDBObjectBuilder.start("$gte", new ObjectId("565ef85ee4b0a4db3c2fc96b")).get());

查询: { "_id" : { "$gte" : { "$oid" : "565ef85ee4b0a4db3c2fc96b"}}}

我的应用程序部署在OpenShift上,我在RockMongo GUI中手动尝试了查询;我得到了相同的空结果 . 但是,如果我手动搜索 { "_id" : ObjectId("565ef85ee4b0a4db3c2fc96b")} ,我会得到正确的结果 .

我的问题是:如何才能正确构建查询以使其有效?

或者,如何让Java驱动程序生成 ObjectId("...") 而不是 {"$oid": "..."}

2 回答

  • 0

    下面的代码片段显示了如何通过 _id 查询Mongo集合 . 请注意, { "$oid": "<id>" } 严格相当于 ObjectId( "<id>" ) . BSON类型的严格模式表示符合JSON RFC,并允许任何JSON解析器将这些严格模式表示作为键/值对进行处理 .

    import org.bson.types.ObjectId;
    
    public DBObject findDocumentById(String id) {
        BasicDBObject query = new BasicDBObject();
        query.put("_id", new ObjectId(id));
        DBObject dbObj = collection.findOne(query);
        return dbObj;
     }
    
  • 3

    我更喜欢@ImbaBalboa的风格answer

    import static com.mongodb.client.model.Filters.eq;
    import org.bson.Document;
    import com.mongodb.client.FindIterable;
    import com.mongodb.client.MongoCollection;
    Document myDoc = collection.find(eq("_id", new ObjectId("565ef85ee4b0a4db3c2fc96b"))).first();
    

相关问题