gpt4 book ai didi

java - 如何根据元素的字段值从数组中删除元素? (Spring-Boot,响应式(Reactive) MongoDB)

转载 作者:行者123 更新时间:2023-11-30 02:06:12 24 4
gpt4 key购买 nike

我有一个 Room 对象。它本质上是一个 DTO。它有一个列表或 MongoDB 用户对象数组。

我一生都无法弄清楚如何根据用户的 id 和其他一些东西(roomId、roomLeaderId)从数组中删除用户。

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.$.userId", kickUserId);
FindAndModifyOptions options = FindAndModifyOptions.options();
options.returnNew(true);
return template.findAndModify(query, update, options, RoomData.class);
}

现在我确实可以选择创建一个 User 对象并将 id 放入并尝试以这种方式删除用户(我还没有尝试过,但我认为这会起作用),但从我对占位符“$”我应该能够删除元素。

{"_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"}

编辑:我对代码进行了一些编辑。在尝试取消设置的过程中,我意识到 id 实际上是 UserRoomData 的 userId。在我的 JUnit 测试中仍然出错。

org.springframework.data.mongodb.UncategorizedMongoDbException:命令失败,错误 2:“无法将 $pull 应用于服务器 localhost:27017 上的非数组值”。完整响应为 { "ok": 0.0, "errmsg": "Cannot apply $pull to a non-array value", "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);
}

引用

https://docs.mongodb.com/manual/reference/operator/update/pull/#remove-items-from-an-array-of-documents

关于java - 如何根据元素的字段值从数组中删除元素? (Spring-Boot,响应式(Reactive) MongoDB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51275938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com