我试图通过使用他独特的_id从集合中获取元素,但我找不到。
这是我的代码
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("DB");
MongoCollection<Document> collection = database.getCollection("COLL");
如果我用
查询我的数据库BasicDBObject query=new BasicDBObject("info.i0","0");
Document myDoc = collection.find(query).first();
System.out.println(myDoc.toJson());
我得到输出
{ "_id" : { "$oid" : "560ea3f205240f065a3e9d19" }, "name" : "MongoDB", "type" : "database", "count" : 1, "info" : { "i0" : "0", "i1" : "1", "i2" : "2", "i3" : "3", "i4" : "4", "i5" : "5", "i6" : "6", "i7" : "7", "i8" : "8", "i9" : "9" } }
但如果我尝试
BasicDBObject query=new BasicDBObject("_id.$oid","560ea3f205240f065a3e9d19");
Document myDoc = collection.find(query).first();
System.out.println(myDoc.toJson());
我得到一个Null指针异常,因为myDoc为null。
我做错了什么?
答案 0 :(得分:6)
$oid
只有preserve BSON representation。
它只对MongoDB内部JSON解析器有意义。
您只需在查询中使用_id
:
BasicDBObject query=new BasicDBObject("_id",new ObjectId("560ea3f205240f065a3e9d19"));
另请注意,_id
字段的类型为ObjectId
,而非String
。
您必须将其包装在ObjectId
构造函数中。
答案 1 :(得分:0)
好消息是您的查询没有问题,但您的文档看起来不正确,如何以$开头插入字段名?
文档对字段名称有以下限制:
字段名称_id保留用作主键;它的值在集合中必须是唯一的,是不可变的,并且可以是除数组之外的任何类型。 字段名称不能以美元符号($)字符开头。 字段名称不能包含点(。)字符。 字段名称不能包含空字符。
答案 2 :(得分:0)
使用JSON(scala):Json.obj("_id" -> Json.obj("$oid" -> "560ea3f205240f065a3e9d19"))