当前位置: 首页 > 知识库问答 >
问题:

具有$and、$in和$eq条件的Springmongo聚合过滤器

赖明煦
2023-03-14
{
 "Field1": "ABC",
 "Field2": [
    { "Field3": "ABC1","Field4": "REVIEWED","Field5":"True" }, 
    { "Field3": "ABC2","Field4": "APPROVED","Field5":"True" }, 
    { "Field3": "ABC3","Field4": "REJECTED","Field5":"True" }, 
    { "Field3": "ABC4","Field4": "APPROVED","Field5":"False" } 
    ]
}

我想获取已批准、已审查和真实记录即。

{
 "Field1": "ABC",
 "Field2": [
    { "Field3": "ABC1","Field4": "REVIEWED","Field5":"True" }, 
    { "Field3": "ABC2","Field4": "APPROVED","Field5":"True" }
    ]
}

以下 MONGO 聚合查询返回正确的结果

{
  "$project": {
    "Field1": "$Field1",
    "Field2": {
      "$filter": {
        "input": "$field2",
        "as": "fld2",
        "cond": {
          "$and": [
            {
              "$in": [
                "$$fld2.field4",
                [
                  "APPROVED",
                  "REVIEWED"
                ]
              ]
            },
            {
              "$eq": [
                "$$fld2.field5",
                "True"
              ]
            }
          ]
        }
      }
    }
  }
}

如何在Springmongo数据db中实现上述查询?Spring Project操作与ArrayOperators.Filter.filter不提供链接操作做和另一个条件。

共有1个答案

何安宜
2023-03-14

您可以像这样尝试使用BasicBObject

 BasicDBObject inOp = new BasicDBObject("$in", Arrays.<Object>asList(
                        "$$fld2.field4",
                        Arrays.asList("APPROVED","REVIEWED")));

  BasicDBObject eqOp = new BasicDBObject("$eq", Arrays.<Object>asList(
                        "$$fld2.field5",
                       "True"));

 BasicDBObject andOp = new BasicDBObject("$and", Arrays.<Object>asList(inOp, eqOp));

 project("Field1")
 .and(new AggregationExpression() {
              @Override
              public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) {
                DBObject filterExpression = new BasicDBObject();
                filterExpression.put("input","$field2");
                filterExpression.put("as", "fld2");
                filterExpression.put("cond",andOp);
                return new BasicDBObject("$filter", filterExpression);
              }
            }).as("Field2");
 类似资料:
  • 我收集了用户在商店购买的物品,以及他从朋友那里得到的喜欢和不喜欢的东西。集合字段如下所示: 现在,我想得到以下总结: 获取用户X的(喜欢-不喜欢)差异 获取用户X的差异(喜欢-不喜欢)到存储Y 获取用户X的(喜欢-不喜欢)差异到商店Y和产品Z 对于#1,我做了: 我得到了正确的结果: [{"_id":"542ea90fbb1e37b09f660980","rankDiff": 2}] 但当我试图通

  • 问题内容: 我是ElasticSearch的新手。 当前,我们正在将代码从关系数据库迁移到ElasticSearch。因此,我们正在将查询转换为ElasticSearch查询格式。 我正在寻找与以下查询等效的ElasticSearch- 有人可以为我提供上面的ElasticSearch查询示例吗? 问题答案: 根据上面的查询,您将拥有一个带有类型文档的索引,该文档的映射如下所示: 然后,相当于您上

  • 假设我有一张房间清单 每个房间都有一份人员名单。 使用java8 streams,我想迭代房间列表,获取所有人员,在每个节点上执行一些方法(doSomething()),并获取所有过滤对象的列表。 这是使用java 8的最佳实践吗?

  • 问题内容: 我正在尝试对某些条件过滤后的值进行汇总。我正在使用spring数据的ElasticSearchTemplate.query()方法也执行查询并在结果提取器中获取结果。我正确地找到了匹配(即应用了过滤器,并且仅检索了与这些值匹配的文档。)。但是,汇总是在所有文档上执行的。我认为汇总应仅应用于过滤后的值。以下是我正在使用的代码: 为了进一步调试问题,我编写了代码来执行查询,而不是使用spr

  • 问题内容: 如何在$ lookup之后添加过滤器,或者有其他方法可以执行此操作? 我的数据收集测试是: 我选择ID 100并汇总孩子: 我回来了: 但我只希望与“值:1”匹配的子项 最后,我希望得到以下结果: 问题答案: 这里的问题实际上是关于一些不同的东西,根本不需要。但是,对于仅从“$lookup之后过滤”标题到达此处的任何人,这些都是适合您的技术: MongoDB 3.6-子管道 较早-$

  • 我想根据字段中的关键字出现来制作桶。 我检查了elasticsearch留档,发现过滤器聚合应该很合适:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filters-aggregation.html#search-aggregations-bucket-filte