我有一个存储在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"}]}}}
答案 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'}}}”)
它与您提供的文档相符。