- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 mongotemplate 创建聚合查询,其中按日期(即 2016-03-01)而不是日期时间(即 2016-03-01 16:40:12)进行分组。dateToString
操作存在于 mongodb 文档中,它可用于使用格式从日期时间中提取日期: https://docs.mongodb.org/manual/reference/operator/aggregation/dateToString/但我得到它与 mongotemplate 一起工作 - 我得到一个 NullPointerException。(我的数据库版本是3.2)
List<AggregationOperation> aggregationOperations = new ArrayList<AggregationOperation>();
aggregationOperations.add(
Aggregation.project("blabla", ...).
andExpression("dateToString('%Y-%m-%d',timeCreated).as("date"));
aggregationOperations.add(Aggregation.group("date").sum("blabla").as("blabla"));
AggregationResults<?> aggregationResults = this.mongoTemplate.aggregate(
Aggregation.newAggregation(aggregationOperations),
collectionName,
resultClass);
当我使用 dayOfMonth(timeCreated)
提取日期时,没有异常(exception),但我找不到如何使用 dateToString
进行此操作的示例。我试过没有 '' 的日期格式,但它也没有用......
这是我得到的异常:
java.lang.NullPointerException
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:226)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:255)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:255)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:255)
at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:324)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:263)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:194)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:136)
at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:36)
at com.mongodb.OutMessage.putObject(OutMessage.java:289)
at com.mongodb.OutMessage.writeQuery(OutMessage.java:211)
at com.mongodb.OutMessage.query(OutMessage.java:86)
at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:81)
at com.mongodb.DB.command(DB.java:320)
at com.mongodb.DB.command(DB.java:299)
at com.mongodb.DB.command(DB.java:374)
at com.mongodb.DB.command(DB.java:246)
at org.springframework.data.mongodb.core.MongoTemplate$2.doInDB(MongoTemplate.java:357)
at org.springframework.data.mongodb.core.MongoTemplate$2.doInDB(MongoTemplate.java:355)
at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:442)
at org.springframework.data.mongodb.core.MongoTemplate.executeCommand(MongoTemplate.java:355)
at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1497)
at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1432)
编辑:
最终我们在这里决定采用不同于下面建议的解决方案,我将其写在这里以防其他人发现它有用:
除了包含日期时间的“timeCreated”字段外,我们还在文档中保存了另一个字段:“date”,它只包含日期(只要是长)。
例如,如果“timeCreated”=“2015-12-24 16:36:06.657+02:00”,则日期为“2015-12-24 00:00:00”,我们保存 1449180000000。现在我们可以简单地按“日期”分组。
最佳答案
您可以先尝试使用 SpEL andExpression
投影字段在projection操作中,然后在group操作中按新字段进行分组:
Aggregation agg = newAggregation(
project()
.andExpression("year(timeCreated)").as("year")
.andExpression("month(timeCreated)").as("month")
.andExpression("dayOfMonth(timeCreated)").as("day"),
group(fields().and("year").and("month").and("day"))
.sum("blabla").as("blabla")
);
AggregationResults<BlaBlaModel> result =
mongoTemplate.aggregate(agg, collectionName, BlaBlaModel.class);
List<BlaBlaModel> resultList = result.getMappedResults();
关于java - MongoTemplate 聚合 - 按日期分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34577877/
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我已经在 Spring Boot 中配置了 MongoDB 连接。现在我想使用 MongoTemplate find() 方法运行自定义查询。但 Spring Boot 不允许我这样做。 @Autow
从 1.9.0.RELEASE 开始,spring-data-mongodb 支持批量更新。 BulkOperations ops = template.bulkOps(BulkMode.UNORDE
我有一个名为 collection_One 的集合.我想重命名集合,但失败了。 mongotemplate给我看了: executing the 'renameCollection' command
MongoTemplate 不返回结果。 JSON: { "_id" : ObjectId("51acf6ab0d5d46077ae12b2a"), "docType" : "row",
我正在使用 MongoTemplate 来执行我的 Mongo 查询。我想知道计数是否适用于限制集? 尽管设置了限制,为什么查找查询会搜索完整集合(根据查询)?例如我写的查询可能会产生 10000 条
我正在尝试使用 MongoTemplate 和聚合框架在 Spring Boot 项目中运行聚合管道。 我的查询执行时没有任何异常。但是,当我尝试在 AggregationResults 实例上调用
我正在尝试从 mongoDb 中的嵌入字段数组中删除一个项目。数组是一种字符串类型,如下所示。 { _id: 1, fruits: [ "apples", "pears", "orange
对于 Upsert MongoTemplate 提供了一种按以下方式使用的方法。 但是,它只会设置名称。如果我想插入与新用户对象关联的所有键该怎么办?即除了姓名之外,我还想插入电子邮件和许多其他值。我
我需要在 MongoTemplate 中提取子文档,但不知道该怎么做。 我保存的文档是: { "_id" : "FooUser", "_class" : "com.domain.Use
我需要编写一个查询,它可以查找数据库中子数组大小大于某值的对象。 我的对象看起来像: { "_id" : ObjectId("sbg8732god78"), "studentIds"
我有一个端点,它接受文档 ID,以及我想要更新的嵌套数组中的 Employee 对象。这工作正常。我尝试修改端点以获取超过 1 名员工并让它一次更新所有员工,但我无法让它工作。我不确定我是否格式错误,
我想创建一个 DAO,将用户保存到我的数据库中。他们应该有唯一的登录名,这有点问题,因为 mongo db 没有事务。我有一个类,其中的用户如下所示: @Document(collection = "
我正在尝试转换以下查询: { "cd" : { "$lte" : ISODate("2013-06-30T09:12:29Z") , "$gte" : ISODate("2013-06-11T09:1
我的以下 mongodb 查询按预期工作 db.importedDataItems.aggregate({ $match: { mobile: "1234567890"
我正在根据多个参数生成一个复杂的 Mongo 查询。我想用 Criteria 辅助类制定的标准之一是: {"field1": {$exists: true, $ne: false}} 我试着用: Cr
在我们的应用程序中,我们管理许多 MongoTemplate 实例,每个实例代表一个客户端数据库。对于大多数数据库操作,我们希望使用 secondaryPreferred 读取首选项,以便利用集群的只
我在 MongoDB 中有像这样的 JSON 文档 { "os" : "Windows 10" } { "os" : "WINDOWS 8" } { "os" : "UBunTu 18.0
我正在使用 MongoTemplate 进行我的数据库操作。现在我想从所选结果中获取最大字段值。有人可以指导我如何编写查询,以便当我将查询传递给 find 方法时,它将返回我所需的最大文档字段。提前致
我有一个 Entity 类,它是一个包含基本字段的抽象类。考虑以下代码: Entity entity = new DogEntity() mongoTemplate.save(entity) 在这种情
我是一名优秀的程序员,十分优秀!