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

时间:2015-12-03 10:58:50

标签: java mongodb

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

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

  

{      “_id”:ObjectId(“565ef85ee4b0a4db3c2fc9696”),...}

尽管如此,我从来没有得到任何结果。

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

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(“565ef85ee4b0a4db3c2fc9696”)} ,我会得到正确的结果。

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

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

2 个答案:

答案 0 :(得分:3)

下面的代码段显示了如何通过_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;
 }

答案 1 :(得分:0)

我更喜欢@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();