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

ACE*_*CEG 4 java mongodb

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

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

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

尽管如此,我还是没有得到任何结果。

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

1.

BasicDBObject query = new BasicDBObject();
query.put("_id", "565ef85ee4b0a4db3c2fc96b");
Run Code Online (Sandbox Code Playgroud)

查询:{“_id”:“565ef85ee4b0a4db3c2fc96b”}

2.

BasicDBObject query = new BasicDBObject();
query.put("_id", new ObjectId("565ef85ee4b0a4db3c2fc96b"));
Run Code Online (Sandbox Code Playgroud)

查询:{“_id”:{“$oid”:“565ef85ee4b0a4db3c2fc96b”}}

3.

BasicDBObject query = new BasicDBObject("_id", "565ef85ee4b0a4db3c2fc96b");
Run Code Online (Sandbox Code Playgroud)

查询:{“_id”:“565ef85ee4b0a4db3c2fc96b”}

4.

BasicDBObject query = new BasicDBObject("_id", new ObjectId("565ef85ee4b0a4db3c2fc96b"));
Run Code Online (Sandbox Code Playgroud)

查询:{“_id”:{“$oid”:“565ef85ee4b0a4db3c2fc96b”}}

5.

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

查询:{“_id”:{“$gte”:{“$oid”:“565ef85ee4b0a4db3c2fc96b”}}}

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

我的问题是:如何正确构建查询以使其正常工作?

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

Ale*_*lex 5

下面的代码片段显示了如何通过 查询 Mongo 集合_id。请注意,这{ "$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;
 }
Run Code Online (Sandbox Code Playgroud)