Фильтрация вложенного массива в драйвере Mongo Java

#java #mongodb

#java #mongodb

Вопрос:

Следующий запрос NoSQL возвращает все отзывы конкретного пользователя :

 db.getCollection('catalog-review').aggregate([
{
     $project: {
       reviews: {
         $filter: {
           input: "$reviews",
           as: "review",
           cond: { $eq: [ "$$review.userId", 121 ] }
          }
        }
      }
}
])
  

Этот запрос работает нормально, но если я реализую это в Java с помощью драйвера Mongo, «$$» не работает.

 List<CatalogReview> reviews = collection.aggregate(Arrays.asList(
            new Document("$project", new Document("reviews", new Document("$filter", new Document("input", "$reviews")
                    .append("as", "review").append("cond", new Document("$eq", Arrays.asList(new Document("$$review.userId", 121)))))))
    )).into(new ArrayList<>());
  

Сообщение об ошибке:

 com.mongodb.MongoCommandException: Command failed with error 15999: 'invalid operator '$$review.userId'' on server localhost:27017. The full response is { "ok" : 0.0, "errmsg" : "invalid operator '$$review.userId'", "code" : 15999 }
  

Поддерживает ли драйвер Mongo агрегатные функции?

Ответ №1:

Проблема Arrays.asList(new Document("$$review.userId", 121)) в том. Так и должно быть Arrays.asList("$$review.userId", 121) .

Arrays.asList(new Document("$$review.userId", 121)) = [ { "$$review.userId" : 121 } ]

Arrays.asList("$$review.userId", 121) = [ "$$review.userId", 121 ]

Фрагмент должен быть таким, как показано ниже:

 List<CatalogReview> reviews = collection.aggregate(Arrays.asList(
            new Document("$project", new Document("reviews", new Document("$filter", new Document("input", "$reviews")
                    .append("as", "review").append("cond", new Document("$eq", Arrays.asList("$$review.userId", 121))))))
    )).into(new ArrayList<>());
  

Комментарии:

1. Работает как шарм! Спасибо.