Java 如何基于元素';从数组中删除元素;s字段值?(弹簧靴,反应式MongoDB)
我有一个房间物件。它本质上是一个DTO。它有一个用户对象的列表或MongoDB数组 就我的一生而言,我不知道如何根据用户id和其他一些东西(roomId、roomLeaderId)从阵列中删除用户 编辑:我对代码做了一些编辑。在使用unset的部分实验中,我意识到id实际上是UserRoomData的userId。我的JUnit测试仍然出错Java 如何基于元素';从数组中删除元素;s字段值?(弹簧靴,反应式MongoDB),java,mongodb,spring-boot,reactive,Java,Mongodb,Spring Boot,Reactive,我有一个房间物件。它本质上是一个DTO。它有一个用户对象的列表或MongoDB数组 就我的一生而言,我不知道如何根据用户id和其他一些东西(roomId、roomLeaderId)从阵列中删除用户 编辑:我对代码做了一些编辑。在使用unset的部分实验中,我意识到id实际上是UserRoomData的userId。我的JUnit测试仍然出错 org.springframework.data.mongodb.uncategorizedmongodbeexception:命令失败,错误2:服务器lo
org.springframework.data.mongodb.uncategorizedmongodbeexception:命令失败,错误2:服务器localhost:27017上的“无法将$pull应用于非数组值”。完整响应为{“ok”:0.0,“errmsg”:“不能将$pull应用于非数组值”,“code”:2,“codeName”:“BadValue”};嵌套异常是com.mongodb.MongoCommandException:$pull是数组运算符,它使用查询来匹配和删除嵌入数组中的匹配行 差不多
public Mono<RoomData> findAndTryKickUser(String roomId, String requestUserId, String kickUserId){
Query query = new Query();
query.addCriteria(Criteria.where("id").is(roomId).and("roomLeaderId").is(requestUserId)
.and("userRoomDatas").elemMatch(Criteria.where("userId").is(kickUserId)));
Update update = new Update();
update.pull("userRoomDatas", new Query().addCriteria(Criteria.where("userId").is(kickUserId)));
FindAndModifyOptions options = FindAndModifyOptions.options();
options.returnNew(true);
return template.findAndModify(query, update, options, RoomData.class);
}
public Mono-findAndTryKickUser(字符串roomId、字符串requestUserId、字符串kickUserId){
查询=新查询();
query.addCriteria(Criteria.where(“id”)是(roomId.),而(“roomLeaderId”)是(requestUserId)
和(“userRoomDatas”).elemMatch(标准,其中(“userId”)是(kickUserId));
更新=新更新();
update.pull(“userRoomDatas”,newquery().addCriteria(Criteria.where(“userId”).is(kickUserId));
FindAndModifyOptions=FindAndModifyOptions.options();
选项。returnNew(true);
返回模板.findAndModify(查询、更新、选项、RoomData.class);
}
参考文献
您能给我们看一下您收藏的样本文档吗?@Veeram我能。我在这篇文章中做了一些修改,使之更简单,但我将重新编辑我的文章,以反映我的实际代码(我只是更改了变量名)。我还将尝试格式化这篇SOF文章的文档。是的,它起了作用。我不知道您可以将查询对象添加到pull方法。现在很有道理了。非常感谢@Veeram。
{"_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"}
public Mono<RoomData> findAndTryKickUser(String roomId, String requestUserId, String kickUserId){
Query query = new Query();
query.addCriteria(Criteria.where("id").is(roomId).and("roomLeaderId").is(requestUserId)
.and("userRoomDatas").elemMatch(Criteria.where("userId").is(kickUserId)));
Update update = new Update();
update.pull("userRoomDatas", new Query().addCriteria(Criteria.where("userId").is(kickUserId)));
FindAndModifyOptions options = FindAndModifyOptions.options();
options.returnNew(true);
return template.findAndModify(query, update, options, RoomData.class);
}