结合使用MongoDB和Java驱动程序,我有一个要根据其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”:“ ...”}?
下面的代码段显示了如何通过来查询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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句