#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. Работает как шарм! Спасибо.