如何在Spring-Mongo-Java查询中将$ objectToArray放入$ filter中?

我正在使用聚合查询,该查询要求$ 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",false
              ]
            }
          }
        }
      }
    }
  }
]

我尝试了几件事,但过滤器将输入作为字符串,字段或列表值。

我需要类似的东西:

filter(ObjectOperators.valueOf(“ values”)。toArray())

这不是受支持的操作。

作为一种解决方法,我将查询更改为使用2个投影。

[
  {
    "$project": {
      "valsArray": {
        "$objectToArray": "$values"
      }
    }
  },{
    "$project": {
      "count": {
        "$size": {
          "$filter": {
            "input": "$valsArray",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);

这给了我预期的结果,但是我想通过单个项目操作来实现。

任何帮助将不胜感激。

谢谢!

lflxyz 回答:如何在Spring-Mongo-Java查询中将$ objectToArray放入$ filter中?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3118206.html

大家都在问