【发布时间】:2016-05-22 03:38:05
【问题描述】:
我希望得到刚刚插入的文档ObjectId 正在使用insertOne。
根据我的考虑,一种方法是在客户端生成 _id,另一种方法是通过文档的指定字段进行查询。哪种方法更好或有其他方法?
ps:我知道 mongo 中的 ObjectId 生成机器和时间信息。
总之,我只是想知道mongo ObjectId应该在客户端或mongod服务器上生成的说法是什么意思?
【问题讨论】:
我希望得到刚刚插入的文档ObjectId 正在使用insertOne。
根据我的考虑,一种方法是在客户端生成 _id,另一种方法是通过文档的指定字段进行查询。哪种方法更好或有其他方法?
ps:我知道 mongo 中的 ObjectId 生成机器和时间信息。
总之,我只是想知道mongo ObjectId应该在客户端或mongod服务器上生成的说法是什么意思?
【问题讨论】:
正如 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"...)
【讨论】: