First, I will show the state stored in mongodb
.
As you can see, it is a structure with a list called replies
in a list called comments
. And inside replies
there is an array called likes
.
comments : [
Object1 : {
replies : [
likes : [
0 : {},
1 : {}
]
]
},
Object2 : {
replies : [
likes : [
0 : {},
1 : {}
]
]
}
]
What I want to do here is to insert/subtract a value only from the likes
array inside a specific replies
structure. I'm currently using Spring boot and have tried the following:
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(new ObjectId(postId))
.andOperator(Criteria.where("comments")
.elemMatch(Criteria.where("_id").is(new ObjectId(commentId))
.andOperator(Criteria.where("replies")
.elemMatch(Criteria.where("_id").is(new ObjectId(replyId)))
)
)
);
query.addCriteria(criteria);
Update update = new Update();
if (state) {
// remove user id
update.pull("comments.$[].replies.$.likes", new ObjectId(userId));
} else {
// add user id
update.push("comments.$[].replies.$.likes").value(new ObjectId(userId));
}
mongoTemplate.updateFirst(query, update, MyEntity.class);
It is an operation to add or remove userId
according to boolean state
. As a result of the attempt, up to a specific comment
is found, but userId
is unconditionally entered in the first likes
list of the replies
list inside the comment
. What I want is to get into the likes
list inside a specific reply
. Am I using the wrong parameter in update.push()
? I would appreciate it if you could tell me how to solve it.