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

时间:2019-11-12 10:31:22

标签: mongodb spring-boot spring-data-mongodb spring-mongodb

我正在使用聚合查询,该查询要求$ 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);

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

任何帮助将不胜感激。

谢谢!

0 个答案:

没有答案