簡體   English   中英

Spring MongoDB中的聚合管道

[英]Aggregation pipeline in spring mongodb

我需要使用spring data mongo db創建聚合plepleine。 我正在使用下面的代碼來過濾對象數組。 它工作得很好

Aggregation aggregation = newAggregation(
                match(new Criteria().andOperator(criteriaList.toArray(new Criteria[criteriaList.size()]))),
                project().and(new AggregationExpression() {
                    @Override
                    public Document toDocument(AggregationOperationContext aggregationOperationContext) {
                        Document filterExpression = new Document();
                        filterExpression.put("input", "$dailyVisitorStats");
                        filterExpression.put("as", "dailyVisitorStat");
                        filterExpression.put("cond", new Document("$eq", Arrays.asList("$$dailyVisitorStat.weekNum", weekNum)));
                        return new Document("$filter", filterExpression);
                    }
                }).as("dailyVisitorStats")

但對於其他用例,我需要添加兩個條件。 在上面的“ Cond”示例中,我需要添加條件

{ $and: [
       { $eq: [ "$$dailyVisitorStat.weekNum", 22 ] },
        { $gte: [ "$$dailyVisitorStat.today", ISODate("2019-06-01T00:00:00.000Z" ) ] },
        { $lte: [ "$$dailyVisitorStat.today", ISODate("2019-06-01T23:59:59.000Z" ) ] }
      ] }
  }

原始的MongoDb $ Project階段如下圖所示。我試圖在Spring Mongo中編寫相同的內容

{
  "dailyVisitorStats":{
  $filter: {
     input: "$dailyVisitorStats",
     as: "dailyVisitorStat",
     cond: { $and: [
       { $eq: [ "$$dailyVisitorStat.weekNum", 22 ] },
        { $gte: [ "$$dailyVisitorStat.today", ISODate("2019-06-01T00:00:00.000Z" ) ] },
        { $lte: [ "$$dailyVisitorStat.today", ISODate("2019-06-01T23:59:59.000Z" ) ] }
      ] }
  }
}
}

我該怎么做 ???

您可以嘗試以下片段嗎? 我無法在mongo實例上運行它,但是從語法上(希望)在邏輯上是正確的。

Aggregation aggregation = newAggregation(
        match(new Criteria().andOperator(criteriaList.toArray(new Criteria[criteriaList.size()]))),
        project().and(ArrayOperators.Filter.filter("dailyVisitorStats")
                .as("dailyVisitorStat")
                .by(BooleanOperators.And.and(
                        ComparisonOperators.Eq.valueOf("dailyVisitorStat.weekNum").equalTo(weekNum),
                        ComparisonOperators.Gte.valueOf("dailyVisitorStat.today").greaterThanEqualTo(date1),
                        ComparisonOperators.Lte.valueOf("dailyVisitorStat.today").lessThanEqualTo(date2))))
            .as("dailyVisitorStats"));

我使用了$filter支持,在這里詳細介紹了DATAMONGO-1491

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM