你能用Morphia在MongoDb中聚合LocalDateTime吗?

时间:2016-11-16 17:41:38

标签: mongodb java-8 morphia

我正在使用Morphia访问我的mongoDB。

我的一个集合中有一个lastUpdatedTimestamp声明为Java8 LocalDateTime。

我正在使用这个java代码: -

Iterator<CountResult> iterator = datastore.createAggregation(MyClass.class).group(Arrays.asList(Group.grouping("$year", "timestamp")), Group.grouping("count", new Accumulator("$sum", 1))).aggregate(CountResult.class);

我希望根据$ year $ month $ day $ hour汇总我的数据,但只需尝试$ hour或$ year我就会收到此异常

com.mongodb.MongoCommandException: Command failed with error 16006: 'can't convert from BSON type EOO to Date' on server localhost:27017. The full response is { "ok" : 0.0, "errmsg" : "can't convert from BSON type EOO to Date", "code" : 16006 }

是否可以使用morphia汇总Java8 LocalDateTime?

1 个答案:

答案 0 :(得分:1)

注意你的LocalDateTime如何存储在mongodb文档结构中。

        "lastUpdatedTimestamp": {
        "date": {
            "year": NumberInt("2016"),
            "month": NumberInt("11"),
            "day": NumberInt("3")
        },
        "time": {
            "hour": NumberInt("4"),
            "minute": NumberInt("55"),
            "second": NumberInt("43"),
            "nano": NumberInt("0")
        }
    }

字段lastUpdatedTimestamp可能是内部有两个对象的对象:日期和时间,每个对象都有相应的整数。

在这种情况下,您应该查询并汇总此类字段,例如

db.MyClass.aggregate(
{"$group" : { "_id": "$lastUpdatedTimestamp.date.day", "count": { "$sum": 1 } } },
{"$match": {"count" : {"$gt": 1} } })

这不是吗啡,但你已经明白了。