先物のみを使用して以前のクエリに基づいて条件付きで文書を更新する方法について混乱します。ReactiveMongo条件付き更新
私は、その配列のサイズが指定されたIntegerより小さい場合にのみ、ある値をドキュメントの配列にプッシュしたいとします。
ドキュメントを取得した後、この関数を使用してドキュメントを取得しています。値をプッシュしていますが、私が行うことができないのは条件付きで行うことです。私はこれを行うことができない理由で混乱しています
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] 必要は:両方の場合、他の枝 'updateResult' の
をresponse.group.GroupResponse.GroupActionCompleted。これは、条件付きでドキュメントを更新する適切な方法です。つまり、それをクエリしていて、ロジックを実行してから別のクエリを実行しますか?
なぜ 'findAndModify'を見ていませんか? – cchantep
@cchantep私が理解しているように、私はクエリ自体の中で条件付きの更新を行うことはできません。これはmongodbのドキュメントを読んだ後に設計されたもので、ビジネスロジックがクエリから外れるべきであることを意味します。 – StackTraceYo
条件付きで意味することは「findAndModify」によってクエリに一致する既存のドキュメントを更新または削除できます。 – cchantep