Ошибка агрегации Spring Data MongoTemplate «вход в $ filter должен быть массивом, а не объектом» - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть такая структура документа:

{
    "_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 [], и он все еще не работал.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 30 сентября 2018

Nevermind,

Кто-то (я) по ошибке поместил один элемент в виде объекта вместо массива.Это все испортило.Просто удалил всю эту запись и все нормально.

...