如何在一个数组中使用两个条件?

时间:2014-08-13 10:55:54

标签: spring mongodb spring-data

我有一个存储在Mongo中的任务列表,如下面的

{
"name": "task1",
"requiredOS": [
    {
        "name": "linux",
        "version": [
            "6.0"
        ]
    },
    {
        "name": "windows",
        "version": [
            "2008",
            "2008R2"
        ]
    }
],
"requiredSW": [
    {
        "name": "MySQL",
        "version": [
            "1.0"
        ]
    }
]
}

我的目的是通过操作系统和软件过滤任务,例如用户给我低于过滤条件

{
"keyword": [
    {
        "OS": [
            {
                "name": "linux", 
                "version": [
                    "6.0"
                ]
            }, 
            {
                "name": "windows", 
                "version": [
                    "2008"
                ]
            }
        ]
    }, 
    {
        "SW": [ ]
    }
]

}

我需要通过搜索" requiredOS"来过滤掉所有可以在windows2008和Linux 6.0上运行的任务。和" requiredSW"提起。如您所见,搜索条件是一个数组(" OS"部分)。使用数组作为搜索条件时遇到问题。我希望查询返回一个满足条件的Task列表。

一个具有挑战性的事情是我需要使用@Query将查询集成到spring-data中。所以查询必须参数化

任何人都可以帮我一把吗?

我尝试了一个查询但没有返回任何内容。我的目的是使用$ all将两个条件组合在一起然后使用$ elemMatch来搜索" requiredOS"字段

{"requiredOS":{"$elemMatch":{"$all":[{"name":"linux","version":"5.0"},{"name":"windows","version":"2008"}]}}}

2 个答案:

答案 0 :(得分:0)

您基本上似乎需要将您的“参数”转换为生成结果的查询表单,而不是直接传递它们。这是一个“翻译”示例,其中“空”数组被认为与“任何”匹配。

其他条件也没有“字面上”直接通过。这样做的原因是MongoDB认为它意味着“完全匹配”。所以你想要的是多个数组条件的$elemMatch运算符和组合同一属性元素的条件的$and运算符的组合。

这比$all略长,但主要是因为$and db.collection.find({ "$and": [ { "requiredOS": { "$elemMatch": { "name": "linux", "version": "6.0" } } }, { "requiredOS": { "$elemMatch": { "name": "windows", "version": "2008" } } } ] }) $in之间的 DBObject query = new Query( new Criteria().andOperator( Criteria.where("requiredOS").elemMatch( Criteria.where("name").is("linux").and("version").is("6.0") ), Criteria.where("requiredOS").elemMatch( Criteria.where("name").is("windows").and("version").is("2008") ) ) ).getQueryObject(); 形式是“缩短”形式:

{{1}}

因此,只需转换请求中的属性即可实际匹配所需的查询表单。

将此构建到查询对象中可以通过多种方式完成,例如使用“查询”构建器:

{{1}}

然后,您可以将其作为查询对象或任何其他接受查询对象的方法传递给mongoOperations方法。

答案 1 :(得分:0)

如果我理解你正在尝试的是什么,你需要使用$ elemMatch运算符:

http://docs.mongodb.org/manual/reference/operator/query/elemMatch/#op._S_elemMatch

举个例子,查询应该是这样的: @Query(“{'requiredOS':{$ elemMatch:{name:'linux',version:'7.0'},$ elemMatch:{name:'windows',version:'2008'}}}”)

它与您提供的文档相符。