我很困惑如何使用只有期貨根據以前的查詢有條件地更新文檔。ReactiveMongo有條件更新
讓我說只有當該數組的大小小於給定的整數時,我纔會將某個值推送到文檔中的數組中。
我正在使用這個函數來獲取文檔,在獲取文檔後,我正在推動值 - 我無法做的是有條件地做到這一點。
def joinGroup(actionRequest: GroupRequests.GroupActionRequest): Future[GroupResponse.GroupActionCompleted] = {
//groupisNotFull() is a boolean future
groupIsNotFull(actionRequest.groupId).map(
shouldUpdate => {
if(shouldUpdate){
Logger.info(actionRequest.initiator + " Joining Group: " + actionRequest.groupId)
val selector = BSONDocument("group.groupid" -> BSONDocument("$eq" -> actionRequest.groupId))
val modifier = BSONDocument("$push" -> BSONDocument("group.users" -> "test-user"))
val updateResult = activeGroups.flatMap(_.update(selector, modifier))
.map(res => {
GroupActionCompleted(
actionRequest.groupId,
actionRequest.initiator,
GroupConstants.Actions.JOIN,
res.ok,
GroupConstants.Messages.JOIN_SUCCESS
)
})
.recover {
case e: Throwable => GroupActionCompleted(
actionRequest.groupId,
actionRequest.initiator, GroupConstants.Actions.JOIN,
success = false,
GroupConstants.Messages.JOIN_FAIL
)
}
updateResult
}
else {
val updateResult = Future.successful(
GroupActionCompleted(
actionRequest.groupId,
actionRequest.initiator,
GroupConstants.Actions.JOIN,
success = false,
GroupConstants.Messages.JOIN_FAIL
))
updateResult
}
}
)
}
//returns a Future[Boolean] based on if there is room for another user.
private def groupIsNotFull(groupid: String): Future[Boolean] = {
findGroupByGroupId(groupid)
.map(group => {
if (group.isDefined) {
val fGroup = group.get
fGroup.group.users.size < fGroup.group.groupInformation.maxUsers
} else {
false
}
})
}
我爲什麼我不能做到這一點困惑。編譯錯誤是:
錯誤:類型不匹配; 發現:scala.concurrent.Future [response.group.GroupResponse.GroupActionCompleted] 要求:response.group.GroupResponse.GroupActionCompleted
兩個if和else分支 'updateResult'。
作爲一個側面的問題..這是有條件地更新文件的正確方法 - 即查詢它,做一些邏輯,然後執行另一個查詢?
爲什麼不看看'findAndModify'? – cchantep
@cchantep據我所知,我不能在查詢本身內進行條件更新。這是由設計閱讀MongoDB的文檔後,該業務邏輯應該走出查詢 – StackTraceYo
這取決於你的條件是什麼意思的,'findAndModify'允許更新或刪除現有的文檔與查詢匹配的。 – cchantep