у меня есть такие поля в сущности:MongoDB Агрегация. Проверьте, если вложенный массив содержит значение
private String userId;
private String username;
private Date created;
private List<Comment> comments = new ArrayList<>();
Comment
есть такие поля:
private String userId;
private String username;
private String message;
private Date created;
мне нужно сделать агрегацию, и получить что-то вроде этого:
{
"userId" : "%some_userId%",
"date" : "%some_date%",
"commentsQty" : 100,
"isCommented" : true
}
Мое агрегирование выглядит следующим образом:
{ "aggregate" : "%entityName%" , "pipeline" : [
{ "$project" : {
"username" : 1 ,
"userId" : 1 ,
"created" : 1 ,
"commentQty" : { "$size" : [ "$comments"]}}}]}
И он отлично работает. Но мне нужно также проверить, что IF comments array содержит некоторый комментарий, с определенным userId. Я попробовал это одно, но оно не исполняет:
{ "aggregate" : "%entityName%" , "pipeline" : [
{ "$project" : {
"username" : 1 ,
"userId" : 1 ,
"created" : 1 ,
"commentQty" : { "$size" : [ "$comments"]} ,
"isCommented" : { "$exists" : [ "$comments.userId" , "5475b1e45409e07b0da09235"]}}}]}
с таким сообщением: Command execution failed: Error [exception: invalid operator '$exists']
Как такая проверка может быть сделано?
UPD: Также судимые операторы $in
и подобные, но они действительны для беспокойства, а не для агрегации.
Спасибо за ответ. Но кажется, что это не то, что мне нужно. Мне нужно проверить, имеет ли массив CONTAINS определенное значение. В моем случае мне нужно проверить, если массив $ comments содержит комментарий с userId, скажем, «5475b1e45409e07b0da09235». – Shatranaft
Я имею в виду, isCommented поле, это - комментирует ME, средний, текущий пользователь. Поэтому мне нужно проверить его во время агрегации, чтобы избежать еще одного запроса mongo ... – Shatranaft
Проверьте мой обновленный ответ. Итак, у комментариев - userId будет ObjectId соответствующего пользователя? – BatScream