奇怪的Curbah Mongo驱动程序的MongoCollection类的更新功能

时间:2015-06-12 21:19:23

标签: mongodb scala casbah

如您所知,casbah mongodb驱动程序具有以下更新功能:

def update [A, B] (q: A, o: B)(implicit arg0: (A) ⇒ DBObject, arg1: (B) ⇒ DBObject) : WriteResult

我想我理解scala的概念。但是,据我所知,这个更新函数应该像这样使用:

collection.update(MongoDBObject(...), MongoDBObject(...))

这让我很困惑。由于我没有填写更新方法的第二个参数列表,我认为上面的表达式会返回一个函数,如:

(implicit arg0: (A) ⇒ DBObject, arg1: (B) ⇒ DBObject) => WriteResult

但事实并非如此。是因为第二个函数参数列表中参数的隐式定义?

1 个答案:

答案 0 :(得分:0)

Casbah图书馆订阅了“pimp my library”模式。它扩展了官方的MongoDB Java驱动程序,并添加了implicits和其他功能,以使Java驱动程序在scala中感觉“本机”。

update方法如下所示:

  /**
   * Performs an update operation.
   * @param q search query for old object to update
   * @param o object with which to update <tt>q</tt>
   */
  def update[A, B](q: A, o: B, upsert: Boolean = false, multi: Boolean = false,concern: com.mongodb.WriteConcern = this.writeConcern
this.writeConcern)(implicit queryView: A => DBObject,
                            objView: B => DBObject,
                            encoder: DBEncoder = customEncoderFactory.map(_.create).orNull): WriteResult = {
    underlying.update(queryView(q), objView(o), upsert, multi, concern, encoder)
}

Java驱动程序需要DBObject才能进行更新操作,但Casbah提供了一个Scala帮助程序,用于在MongoDBObject中创建DBObject。为了提供Scala类型和Java类型之间的互操作,我们可以使用implicit parameters

由于编译器在编译时会知道A,因此可以确定type A => DBObject的隐式定义是否在范围内。 Casbah然后使用该方法queryView(q)q转换为DBObject并将其传递给基础更新。