java - 使用 spring-data-mongodb 将数组作为过滤器函数中的参数传递

标签 java mongodb spring-data aggregation-framework spring-data-mongodb

我有这个文档集合:

[
    {
        "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);

最佳答案

我解决了我的问题。

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"))

关于java - 使用 spring-data-mongodb 将数组作为过滤器函数中的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51084824/

相关文章:

mongodb - 将数据从HDFS导出到MongoDB

mongodb - 从 MongoExport 中的 unix 时间戳查询 ISODate

spring - 使用 Spring 限制 findAll 可能?

build - 在 Linux 上构建 OpenJDK 时可以设置多少个调试选项?

java - spring AOP错误为0找不到引用的切入点

Java 未捕获 lambda 引发的未经检查的异常

java - SQLite 帮助 - 如何显示新 Activity 的分数

node.js - 对 MongoDb 数据库执行操作时页面挂起

rest - 如何将 PageRequest 对象转换为查询字符串?

java - 有没有办法将 MySql TIMESTAMP 映射到 java.lang.Long?