将 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": "..."}?
下面的代码片段显示了如何通过 查询 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)
| 归档时间: |
|
| 查看次数: |
5489 次 |
| 最近记录: |