首页 > 解决方案 > spring mongo 聚合过滤器

问题描述

我正在使用 spring 在 mongodb 上运行协议查询。我会为我的投影添加一些过滤器。所以我想用spring写流程代码

db.mycollection.aggregate( [
  {$match: {"_id" : { "$binary" : "sU7XGDnFYz53KHVhP+sZlQ==", "$type" : "03" } }},
  {$project: {
         myarray: {
            $filter: {
               input: "$myarray",
               as: "item",
               cond: { $in: [ "$$item._id", ["JshGyMImCsSceiPqqCCinlAtTrIkwvlx", "0000022211"] ] }
            }
         },
         "colomn" :1,

          myarray2: {
            $filter: {
               input: "$myarray2",
               as: "item",
               cond: { $in: [ "$$item.name", ["name1", "name2"] ] }
            }
         }
      }
  }
] );

我尝试用 Spring Mongo 写作

    /*<arrayname,list ids>*/
    Map<String, List<Object>> arraysAggregationMap = new HashMap<>();

    ...


ProjectionOperation projectionOperation = project();

    //adding projections

    for (String f: fields) {
      projectionOperation = projectionOperation.and(f).as(f);
    }

// filters
    for (Entry<String, List<Object>> entry: arraysAggregationMap.entrySet()
        ) {
      projectionOperation =  projectionOperation.and(filter(entry.getKey()).as("item").by(
          in("item"+"._id",entry.getValue()).toString())).as(entry.getKey());

    }
    Aggregation aggregation;

    if(fields.size()>0 ||arraysAggregationMap.size() >0) aggregation = newAggregation(match(creteria),projectionOperation);
    else  aggregation = newAggregation(match(creteria));


AggregationResults results = mongoOperation.aggregate(aggregation,entityClass,Document.class);

但是$filter工作方式不一样。

标签: javaspringmongodbspring-data-mongodb

解决方案


推荐阅读