如您所知,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
但事实并非如此。是因为第二个函数参数列表中参数的隐式定义?
答案 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
并将其传递给基础更新。