Передача массива в качестве параметра в функцию фильтра с помощью spring-data-mongodb - PullRequest
0 голосов
/ 28 июня 2018

У меня есть эта коллекция документов:

[
    {
        "name": "name1",
        "data": [
            {
                "numbers": ["1","2","3"]
            }
        ]
    },
    {
        "name": "name2",
        "data": [
            {
                "numbers": ["2","5","3"]
            }
        ]
    },
    {
        "name": "name3",
        "data": [
            {
                "numbers": ["1","5","2"]
            }
        ]
    },
    {
        "name": "name4",
        "data": [
            {
                "numbers": ["1","4","3"]
            }
        ]
    },
    {
        "name": "name5",
        "data": [
            {
                "numbers": ["1","2"]
            }
        ]
    }
]

Я хочу получить все документы этой коллекции, когда массив, переданный в качестве параметра, является подмножеством data.numbers .

Это агрегат, который я использую.

db.testing.aggregate(
    [
        { "$match" : { "data.numbers" : { "$exists" : true } } }, 
        { "$project" : { "is_subset" : { "$filter" : { "input" : "$data", "as" : "d", "cond" : { "$setIsSubset" :[ ["1"],"$$d.numbers"] } } } } }, 
        { "$match" : { "is_subset.0" : { "$exists" : true } } }]
);

Я пытаюсь воспроизвести вышеупомянутое агрегирование в Spring Data MongoDB.

Как передать массив в качестве параметра в $ filter и $ setIsSubset функции?

 operations.aggregate(
                    newAggregation(Testing.class,
                            match(where("data.numbers").exists(true)),
                            project().and(
                                    filter("data")
                                            .as("d")
                                            .by(???))
                                    .as("is_subset"),
                            match(where("is_subset.0").exists(true))
                    ), Testing.class);

1 Ответ

0 голосов
/ 28 июня 2018

Я решаю свою проблему.

operations.aggregate(
                newAggregation(Testing.class,
                        match(where("data.numbers").exists(true)),
                        project("id", "name").and(
                                filter("data")
                                        .as("d")
                                        .by(context -> new Document("$setIsSubset", Arrays.asList(numbers, "$$d.numbers"))))
                                .as("is_subset"),
                        match(where("is_subset.0").exists(true))
                ), Testing.class);

Я создал документ с необходимым мне содержимым в условии $ filter.

new Document("$setIsSubset", Arrays.asList(numbers, "$$d.numbers"))
...