如何使用ReactiveMongo更新文档

时间:2016-02-18 21:52:53

标签: scala reactivemongo

当我找到"campaignID":"DEMO-1"时,我从MongoDB返回以下文档列表。

[
  {
    "_id": {
      "$oid": "56be0e8b3cf8a2d4f87ddb97"
    },
    "campaignID": "DEMO-1",
    "revision": 1,
    "action": [
      "kick",
      "punch"
    ],

    "transactionID": 20160212095539543
  },
  {
    "_id": {
      "$oid": "56c178215886447ea261710f"
    },
    "transactionID": 20160215000257159,
    "campaignID": "DEMO-1",
    "revision": 2,
    "action": [
      "kick"
    ],
    "transactionID": 20160212095539578
  }
]

现在,我在这里尝试做的是给定campaignID我需要找到它的所有版本(在我的情况下是修订版)并将action字段修改为dead类型字符串。我阅读了文档,他们的例子太简单了,在我的案例中没有太大帮助。这就是文档所说的:

val selector = BSONDocument("name" -> "Jack")

val modifier = BSONDocument(
  "$set" -> BSONDocument(
    "lastName" -> "London",
    "firstName" -> "Jack"),
    "$unset" -> BSONDocument(
      "name" -> 1))

// get a future update
val futureUpdate = collection.update(selector, modifier)

我不能只关注文档,因为它很容易创建一个新的BSON文档,并通过硬编码确切的字段来使用它来修改BSON结构。在我的情况下,我需要先找到文档,然后动态修改action字段,因为与文档不同,我的action字段可以有不同的值。

到目前为止我的代码显然无法编译:

def updateDocument(campaignID: String) ={
    val timeout = scala.concurrent.duration.Duration(5, "seconds")
    val collection = db.collection[BSONCollection](collectionName)
    val selector = BSONDocument("action" -> "dead")
    val modifier = collection.find(BSONDocument("campaignID" -> campaignID)).cursor[BSONDocument]().collect[List]()
    val updatedResults = Await.result(modifier, timeout)
    val mod = BSONDocument(
      "$set" -> updatedResults(0),
      "$unset" -> BSONDocument(
        "action" -> **<???>** ))
    val futureUpdate = collection.update(selector, updatedResults(0))
    futureUpdate
  }

2 个答案:

答案 0 :(得分:5)

这对我有用,可以回答我自己的问题。谢谢@cchantep帮助我。

val collection = db.collection[BSONCollection](collectionName)
val selector = BSONDocument("campaignID" -> campaignID)
val mod = BSONDocument("$set" -> BSONDocument("action" -> "dead"))
val futureUpdate = collection.update(selector, mod, multi = true)

答案 1 :(得分:2)

如果您查看BSON documentation,可以看到BSONArray可用于传递BSON值序列。

BSONDocument("action" -> BSONArray("kick", "punch"))

如果您的List[T]值为TBSONWriter[_ <: BSONValue, T]提供了BSONArray,则此列表可以转换为BSONDocument("action" -> List("kick", "punch")) // as `String` is provided a `BSONWriter`

4,5,22,23,1,2,19,20...