2016-02-18 3 views
0

Я получаю следующий список документов из MongoDB, когда я нахожусь для "campaignID":"DEMO-1".Как обновить документ с помощью 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 поле для dead типа String. Я читал документы, и примеры, которые у них есть, слишком просто не слишком полезны в моем случае. Это то, что говорят документы:

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

Я не понимаю нисходящее. Я отправил вопрос и дал ответ, который фактически зафиксировал то, что я хотел исправить. Это может помочь кому-то с аналогичными проблемами. – 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` 
Смежные вопросы