使用casbah将一组字符串添加到现有集合

时间:2014-01-24 21:39:36

标签: mongodb scala casbah

我有一个用户对象如下:

{ 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中每个项目的更新来使其工作,有没有办法在一次调用中执行此操作?

1 个答案:

答案 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()
}