【发布时间】:2018-07-11 22:53:29
【问题描述】:
我知道这个问题已经得到了很多人的回答。但是,我无法找到“正确”执行此操作的 Spring Boot 方式。我找到了一些例子,但我无法让它适用于我的项目。
{"_id":"5b45572047f84e3d10c59b8a"
,"userRoomDatas":[{"isInGame":false,"isReady":true,"isSpectator":false,"userId":"5b45572047f84e3d10c59b84"}]
,"selectedScreen":"MATCHMAKING"
,"privacySetting":"PUBLIC"
,"roomLeaderId":"5b45572047f84e3d10c59b84"
,"botHostId":"5b45572047f84e3d10c59b84"
,"matchmakingData": {"selectedQueId":"5b45572047f84e3d10c59b85","matchmakingRating":"M3"}
,"currentRoomStatus":"IN_ROOM"
,"canStartSearch":false
,"password":"AA=="
,"quickJoinEnabled":true
,"roomRating":"MEMERS_ONLY"
,"_class":"room"}
这是我的文件。我希望能够更改 userRoomDatas 中的一个对象的值。例如 "isSpectator":false 到 "isSpectator":true
public Mono<RoomData> findAndModifyUserSpectate(String roomId, String requestUserId,
boolean isSpecator){
Query query = new Query();
query.addCriteria(Criteria.where("id").is(roomId).and("userRoomDatas")
.elemMatch(Criteria.where("userId").is(requestUserId)));
Update update = new Update();
update.set("userRoomDatas.$.isSpectator : " + isSpecator, new Query(Criteria
.where("userRoomDatas").elemMatch(Criteria.where("userId").is(requestUserId))));
FindAndModifyOptions options = FindAndModifyOptions.options();
options.returnNew(true);
return template.findAndModify(query, update, options, RoomData.class);
}
这是我得到的最好的。我尝试了不同的方法,但我知道它们都错了。
根据我的理解,第一个查询过滤掉了我的 RoomData 对象。但是更新部分我不知道如何引用数组中的文档并告诉它用新值更新其中一个变量。我知道关键部分没有多大意义。我尝试了不同的方法,但我不知道将查询与值放在哪里。
【问题讨论】:
标签: java spring-boot mongodb-query reactive-programming