使用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 回答
下面的代码片段显示了如何通过
_id
查询Mongo集合 . 请注意,{ "$oid": "<id>" }
严格相当于ObjectId( "<id>" )
. BSON类型的严格模式表示符合JSON RFC,并允许任何JSON解析器将这些严格模式表示作为键/值对进行处理 .我更喜欢@ImbaBalboa的风格answer