2016-02-18 45 views
0

當我找到"campaignID":"DEMO-1"時,我從MongoDB獲得以下文檔列表。如何使用ReactiveMongo更新文檔

[ 
    { 
    "_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場String類型的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 
    } 
+0

我想我在選擇器和修改器之間感到困惑。我認爲我的選擇器應該是「動作」 - >「[ 」kick「, 」punch「 ]」'這是合成不正確的,但我不知道如何傳入列表。另外在這個例子中,爲什麼該名稱再次設置,因爲它已被設置爲「傑克」 – summerNight

回答

2

這對我來說是一個回答我自己的問題。謝謝@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) 
+0

我不明白downvote。我發佈了一個問題,並提供了一個實際解決了我想解決的問題的答案。這可能會幫助有類似問題的人。 – summerNight

2

如果你看看BSON documentation,你可以看到BSONArray可以用來傳遞BSON值序列。

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

如果你有List[T]作爲值,與T所提供的BSONWriter[_ <: BSONValue, T],那麼這個名單可以轉化爲BSONArray

BSONDocument("action" -> List("kick", "punch")) 
// as `String` is provided a `BSONWriter`