【问题标题】:Inserting Object into Mongo with _id Output使用 _id 输出将对象插入 Mongo
【发布时间】:2013-09-20 01:52:15
【问题描述】:

如何在 Mongo 中插入一个新对象并获取带有插入文档的 _id

期望的行为:

val _id: String = coll.insert(someObj) // _id = 插入文档的“_id”

【问题讨论】:

  • 许多驱动程序设置您插入的文档的_id
  • 你能给我指一个Casbah吗?
  • 试试 MongoDBObject.get("_id"),可能会奏效。

标签: mongodb scala casbah


【解决方案1】:

您不必寻找它。当您插入一个新对象时,它的 ID 会在客户端生成 侧面,这意味着您在发送之前就已经知道了。

从这里:http://docs.mongodb.org/manual/reference/object-id/

ObjectId 是一个 12 字节的 BSON 类型,构造使用:

一个 4 字节的值,表示自 Unix 纪元以来的秒数, 一个 3 字节的机器标识符, 一个 2 字节的进程 ID,以及 一个 3 字节的计数器,以随机值开头。

因此,当您请求插入新文档时,您已经指定了它。通常您要么使用现有 ID,要么使用 BSONObjectID.generate 生成一个新 ID。

这是一个使用自定义类进行映射的快速草稿(在此示例中,我使用的是 reactivemongo,而不是 casbah):

case class Account(
  id: Option[BSONObjectID],
  firstName: String,
  lastName: String)

然后你在你的 writer 中执行以下操作:

implicit object AccountBSONWriter extends BSONDocumentWriter[Account] {
  def write(account: Account): BSONDocument =
    BSONDocument(
      "_id" -> account.id.getOrElse(BSONObjectID.generate),
      "first_name" -> account.firstName,
      "last_name" -> account.lastName)
}

【讨论】:

  • 但是,如果它是在客户端生成的,那么可能创建一个非唯一值,对吧?
  • 没错。 GUID 和其他 UNIQUE 标识符也不是唯一的,它们使用 Mac 地址来生成唯一 ID,但是如果有人设置了相同的 Mac,那么您可能具有相同的值。但是,它们也使用时间、日期等。这几乎不可能是非唯一的。 MongoDB 也是如此,您在集群中拥有相同硬件的可能性非常罕见,如果不是不可能的话。我需要查看他们的源代码以找到他们究竟使用什么作为机器标识符,但我认为这是非常可靠的。有数十亿条记录的网站...
猜你喜欢
  • 1970-01-01
  • 2016-09-27
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 2018-08-11
  • 2019-02-20
相关资源
最近更新 更多