将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”:“...”} ?
答案 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();