java - 在投影中对大小数组进行除法运算来编写聚合查询的方法

标签 java mongodb mongodb-query aggregation-framework spring-data-mongodb

我想使用 Spring Data MongoDB 运行这个聚合查询。

db.collectionname.aggregate(
   {
        "$group": {
        "_id": "$searchTerm",
        "dateAddToSet": {
            "$addToSet": "$date"
        }
    }
  },
  {
    "$project": {
        "searchTerm": "$_id.searchTerm",
        "percent": {
            "$divide": [{ "$size": "$dateAddToSet" }, 28]
        }
    }
  })

我找不到在 $dataAddToSet 大小上编写除法运算来执行此查询的方法。

非常感谢。

最佳答案

抱歉耽搁了。这里的主要问题是 $size目前在 spring mongo 中不支持操作。因此,构造操作的唯一方法是使用 DBObject 构造。

但是您可以通过提供自己的包装类来混合使用这两种方法,例如:

public class CustomAggregationOperation implements AggregationOperation {
    private DBObject operation;

    public CustomAggregationOperation (DBObject operation) {
        this.operation = operation;
    }

    @Override
    public DBObject toDBObject(AggregationOperationContext context) {
        return context.getMappedObject(operation);
    }
}

因此通常重写 .toDBObject() 方法以仅返回提供给类的构造函数的 DBObject 数据。

然后在构建聚合时使用:

    Aggregation agg = newAggregation(
            group("searchTerm")
                    .addToSet("date").as("dateAddToSet"),
            new CustomAggregationOperation(
                new BasicDBObject("$project",
                    new BasicDBObject("_id",0)
                        .append("searchTerm","$_id")
                        .append("percent",new BasicDBObject(
                                "$divide", new Object[]{
                                    new BasicDBObject("$size","dateAddToSet"),
                                    28
                                }

                            )
                        )
                )
            )
    );

这会生成具有正确格式的管道:

{ 
    "aggregate" : "__collection__" , 
    "pipeline" : [ 
        { "$group" : { 
            "_id" : "$searchTerm" , 
            "dateAddToSet" : { "$addToSet" : "$date" }
        }}, 
        { "$project" : { 
            "_id" : 0 ,
            "searchTerm" : "$_id" , 
            "percent" : { "$divide" : [ { "$size" : "$dateAddToSet" } , 28] }
        }}
    ]
}

因此,这是将可用构建器与自定义构造混合在一起的一种方法,因此您可以在当前不存在构建器的情况下使用方法。

关于java - 在投影中对大小数组进行除法运算来编写聚合查询的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29099281/

相关文章:

mongodb - 如何在 mongodb 中更新或插入嵌套文档到数组中

mongodb - 什么是 MongoDB 中的光标?

java - 如何将我的自定义相机应用程序设置为默认应用程序?

java - Hibernate Criteria API 结果缩小外键范围

javascript - Meteor 你的应用程序崩溃了

mongodb - 如何在不依赖MongoDB的情况下启动spring-boot应用程序?

mongodb - 仅当字段存在于 MongoDB 中时才更新该字段

node.js - 如何通过 $lookup 对 'joined' 集合执行 $text 搜索?

java - Runtime.getRuntime().exec(cmd) 挂起

java - 如何实例化 EntityManager(无法构建 Hibernate SessionFactory)