У меня есть такая структура документа:
{
"_id" : ObjectId("...."),
"oneMoreId" : "....",
"items" : [
{
"itemId" : "...",
"type" : "Food",
}
]
}
Когда я запускаю JSON-запрос в mongodb:
db.inventory.aggregate([
{$match: { $and: [{"oneMoreId":"..."},{"items.type": "Food"}]}},
{"$project": {
"oneMoreId": 1,
"items": {
"$filter": {
"input": "$items",
"as": "item",
"cond": {
"$eq": ["$$item.type", "Food"]
}
}
}
}}
])
Он отлично работает.
Но когда я использую MongoTemplate Spring Data для запуска агрегации, он выдает
вход в $ filter должен быть массивом, а не объектом
Этомой запрос агрегации (только часть проекции):
ProjectionOperation projection = project("oneMoreId").and(new AggregationExpression() {
@Override
public Document toDocument(AggregationOperationContext context) {
return new Document("$filter", new Document(
"input", "$items")
.append("as","item")
.append("cond", new Document("$eq", Arrays.asList("$$item.type","Food")))
);
}
}).as("items");
Я распечатываю его в консоли, и запрос точно такой же, как и запрос JSON выше.Целый.Я даже попробовал запрос данных чистых Spring:
ProjectionOperation projection = project("oneMoreId")
.and(filter("items")
.as("item")
.by(valueOf("item.type")
.equalToValue("Food"))).as("items");
Опять та же ошибка (даже если печать приводит к тому же точному JSON-запросу выше).Java-объект, который содержит элементы, был List.Я изменил его на массив Item [], и он все еще не работал.
Любая помощь будет принята с благодарностью.