Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何基于元素';从数组中删除元素;s字段值?(弹簧靴,反应式MongoDB)_Java_Mongodb_Spring Boot_Reactive - Fatal编程技术网

Java 如何基于元素';从数组中删除元素;s字段值?(弹簧靴,反应式MongoDB)

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

我有一个房间物件。它本质上是一个DTO。它有一个用户对象的列表或MongoDB数组

就我的一生而言,我不知道如何根据用户id和其他一些东西(roomId、roomLeaderId)从阵列中删除用户

编辑:我对代码做了一些编辑。在使用unset的部分实验中,我意识到id实际上是UserRoomData的userId。我的JUnit测试仍然出错


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);
}