我正在使用聚合查询,该查询要求$ objectToArray在$ filter内。该查询工作正常,但我无法为此创建Spring-Mongo Java代码。
这是我的查询:
[
{
"$project": {
"count": {
"$size": {
"$filter": {
"input": { "$objectToArray": "values"},
"as": "vals",
"cond": {
"$eq": [
"$$vals.v.isValid",
false
]
}
}
}
}
}
}
]
这就是我要创建的:
ProjectionOperation countOp = project().and(Size.lengthOfArray(filter("$values")
.as("vals")
.by(valueOf(
"vals.v.isValid")
.equalToValue(
false)))).as("count");
问题出在此代码上,查询在不使用$ objectToArray的情况下进行构建:
[
{
"$project": {
"count": {
"$size": {
"$filter": {
"input": "values",
"as": "vals",
"cond": {
"$eq": [
"$$vals.v.isValid",
false
]
}
}
}
}
}
}
]
我尝试了几件事,但过滤器将输入作为字符串,字段或列表值。
我需要类似的东西:
filter(ObjectOperators.valueOf(“ values”)。toArray())
这不是受支持的操作。
作为一种解决方法,我将查询更改为使用2个投影。
[
{
"$project": {
"valsArray": {
"$objectToArray": "$values"
}
}
},
{
"$project": {
"count": {
"$size": {
"$filter": {
"input": "$valsArray",
"as": "vals",
"cond": {
"$eq": [
"$$vals.v.isValid",
false
]
}
}
}
}
}
}
]
在Spring-Mongo中将相应查询写为:
ProjectionOperation toArrayOp = project().and(ObjectOperators.valueOf("values").toArray()).as("valsArray");
ProjectionOperation countOp= project().and(Size.lengthOfArray(filter("$values")
.as("vals")
.by(valueOf(
"vals.v.isValid")
.equalToValue(
false)))).as("count");
Aggregation aggregation = newAggregation(toArrayOp, countOp);
这给了我预期的结果,但是我想通过单个项目操作来实现。
任何帮助将不胜感激。
谢谢!