为什么reactivemongo collection.save()执行get()?

时间:2015-01-23 16:46:25

标签: mongodb scala reactivemongo

有时候我读了一段专家写的代码,引起了一个大红旗,因为它显然关注的是我一无所知的事情 - 而且可能应该这样做。

在这种情况下,这里是reactivemongo的BSONCollection.save()的实现,它基于ObjectId执行upsert:

def save(doc: BSONDocument, writeConcern: GetLastError)(implicit ec: ExecutionContext): Future[LastError] = {
    doc.get("_id").map { id =>
      update(BSONDocument("_id" -> id), doc, writeConcern, upsert = true)
    }.getOrElse(insert(doc.add("_id" -> BSONObjectID.generate), writeConcern))
  }

请注意,get()方法用于首先确定文档是否存在,然后执行update-upsert或insert,具体取决于。但AFAIK,单独的update()方法(注意" upsert = true")会做同样的事情。我错过了什么?

我猜测同样的问题(无论它们是什么)也适用于任何具有唯一索引的upsert" find"子句 - 不仅仅是ObjectId。这是对的吗?

1 个答案:

答案 0 :(得分:2)

doc.get

只获取文档的_id字段,它不进行查询。 Reactivemongo只是检查你是否有一个_id字段,如果你有,那么它只是插入文件。如果你没有_id字段,那么reactivemongo会为你生成一个.id字段。这段代码只显示使用mongo,_id字段是客户端生成的(有关原因,请参阅https://groups.google.com/forum/#!topic/mongodb-user/pr-KHTMfA3o