【问题标题】:mongo scala driver get _id after use insertOnemongo scala驱动程序在使用insertOne后获取_id
【发布时间】:2016-05-22 03:38:05
【问题描述】:

我希望得到刚刚插入的文档ObjectId 正在使用insertOne
根据我的考虑,一种方法是在客户端生成 _id,另一种方法是通过文档的指定字段进行查询。哪种方法更好或有其他方法?
ps:我知道 mongo 中的 ObjectId 生成机器和时间信息。
总之,我只是想知道mongo ObjectId应该在客户端或mongod服务器上生成的说法是什么意思?

【问题讨论】:

    标签: mongodb scala objectid


    【解决方案1】:

    正如 MongoDB 文档所指定的,如果您使用 Mutable Document,如果您没有提供 _id,您应该取回 MongoDB 自动创建的 Document。

    Insert MongoDB -> See warning part

    正如您所知,在 Scala 中,大部分时间我们都默认使用不可变对象。这是一件好事,因为您避免了副作用导致的失败。

    例如,如果你连接两个列表,你会得到一个新的列表,同样的情况,当你插入一个键时,一个 Map 会返回一个新的 Map。与 Java 等其他语言相反,您将只有一个对象(指针)会改变其内部状态。

    所以如果你使用 Mongo 的不可变文档:

    val doc: org.mongodb.scala.bson.collection.immutable.Document = Document("name" -> "MongoDB", "type" -> "database",
                                 "count" -> 1, "info" -> Document("x" -> 203, "y" -> 102))
    
    collection.insertOne(doc)...
    

    "doc" 将是不可变的(因此您不会有 Mongo 自动生成的 _id)。

    但如果你使用:

    val doc: org.mongodb.scala.bson.collection.mutable.Document = Document("name" -> "MongoDB", "type" -> "database",
                                 "count" -> 1, "info" -> Document("x" -> 203, "y" -> 102))
    
    collection.insertOne(doc)...
    

    插入后,您的“doc”文档中将包含 _id 字段。

    您所说的其他方式是始终使用以下方式提供 ObjectId:

    val doc: Document = Document("_id" -> ObjectId(), "name" -> "MongoDB"...)
    

    【讨论】:

    • 如何使用 mutable.Document 和 insertOne 方法?
    • 注意插入在新驱动程序中是异步的,因此您必须订阅 Observable,或者将其转换为 Future 并对其进行处理...
    • 为什么 collection.insertOne() 方法不使用可变文档作为 scala 驱动程序 1.1.1 中的参数?
    猜你喜欢
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    相关资源
    最近更新 更多