【问题标题】:Java -- MongoDB collection.find() by _idJava -- _id 的 MongoDB 集合.find()
【发布时间】:2015-10-02 20:59:02
【问题描述】:

我正在尝试使用他的唯一 _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());

我得到一个空指针异常,因为 myDoc 为空。

我做错了什么?

【问题讨论】:

    标签: java mongodb collections mongodb-query


    【解决方案1】:

    $oid 只存在于preserve BSON representation

    它只对 MongoDB 内部的 JSON 解析器有意义。

    您只需在查询中使用_id

    BasicDBObject query=new BasicDBObject("_id",new ObjectId("560ea3f205240f065a3e9d19"));

    另外,请注意_id 字段的类型为ObjectId 而不是String

    您必须将其包装在 ObjectId 构造函数中。

    【讨论】:

    • 谢谢。我正在使用 ("_id","ObjectId(\"560ea3f205240f065a3e9d19\")");这就是问题所在。
    【解决方案2】:

    好消息是您的查询没有问题,但您的文档看起来不正确,您如何插入以 $ 开头的文件名?

    文档对字段名称有以下限制:

    字段名_id保留作为主键使用;它的值在集合中必须是唯一的,是不可变的,并且可以是数组以外的任何类型。 字段名称不能以美元符号 ($) 字符开头。 字段名称不能包含点 (.) 字符。 字段名称不能包含空字符。

    http://docs.mongodb.org/manual/core/document/

    【讨论】:

      【解决方案3】:

      使用 JSON (scala):Json.obj("_id" -&gt; Json.obj("$oid" -&gt; "560ea3f205240f065a3e9d19"))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        相关资源
        最近更新 更多