我有一个用户对象如下:
{ user: "joe", acks: ["a", "b" ] }
我想在acks字段中添加一组字符串。以下是我尝试通过一次更新完成此操作:
def addSomeAcks(toBeAcked = Array[String])
DB.getCollection("userAcks").update(
MongoDBObject("user" -> "joe"),
$addToSet("acks") $each toBeAcked
)
}
def test() {
addSomeAcks(Set("x", "y", "z"))
}
当我运行此代码时,我得到一个嵌入式集,如下所示:
{ user: "joe", acks: ["a", "b", ["x", "y", "z" ] ] }
但我想要的结果是:
{ user: "joe", acks: ["a", "b", "x", "y", "z" ] }
我可以通过调用toBeAcked
中每个项目的更新来使其工作,有没有办法在一次调用中执行此操作?
答案 0 :(得分:5)
问题是$each
采用可变数量的参数,而不是Traversable
之类的集合类型。因此,它将您传递的集合视为单个元素,并将其添加到数组中。这会导致你观察到的嵌套。您需要以这种方式解开它:$each(toBeAcked: _*)
或单独传递每个元素$each("x", "y", "z")
。
这是一个完整的示例,可以按照您的预期运行:
package com.example
import com.mongodb.casbah.Imports._
object TestApp extends App {
val col = MongoConnection()("test")("userAcks")
def printAll(): Unit =
col.find().foreach(println)
def insertFirst(): Unit =
col.insert(MongoDBObject("user" -> "joe", "acks" -> List("a", "b")))
def addSomeAcks(toBeAcked: Seq[String]): Unit =
col.update(
MongoDBObject("user" -> "joe"),
$addToSet("acks") $each (toBeAcked: _*))
printAll()
insertFirst()
printAll()
addSomeAcks(Seq("x", "y", "z"))
printAll()
}