如何在 Java 中没有 NumberLong 或 Date Wrapper 的情况下从 Mongodb 接收日期

How to receive Date from Mongodb without NumberLong or Date Wrapper in Java

目前,我正在开发一个 Java/Spring App,我可以在其中保存并提供 JSON from/to 个客户端。

我将日期信息存储为以毫秒为单位的 Unix 时间戳。现在 MongoDB 将其自动存储为

"StartTime": {"$numberLong": "1549640550000"}

当我插入

"StartTime": 1549640550000

我还读到,当我使用 iso8601 格式时,$Date 而不是 $numberLong 会发生这种情况。

如果我的查询结果中没有此包装信息,是否可以从 MongoDB 读取时间信息?

handle/remove 收到纯时间戳信息的信息似乎让我很不舒服。

编辑: 当我使用 document.toJSON (我知道它已被弃用)时,我得到

"StartTime": {"$numberLong": "1549640550000"}

当我使用 document.toString() 我得到 TimeStamp=文档{StartTime=1549554150000}

您需要构建一个 JSON 可以将 NumberLong 转换为 Long 的序列化程序。您可以使用以下设置并将 Document.toJson() 作为参数传递并获得预期的输出。

JsonWriterSettings settings = JsonWriterSettings.builder()
            .int64Converter((value, writer) -> writer.writeNumber(value.toString())).build();

document.toJson(settings); // The output would contain simple long value

这个对我有用。我在网上花了几个小时才弄明白。您可以尝试其中的任何一个。

# These 2 queries are equivalent
db.looks.find({ $and: [{ "version":"v2" }, { "styleid":NumberLong("123456789") }]}).count()
db.looks.find({ "$and": [{ "version":"v2" }, { "styleid":{"$eq":123456789} }]}).count()
db.looks.find({ "$and": [{ "version":"v2" }, { "styleid":{"$in":[123456789]} }]}).count() 

# Java Code 
Criteria criteria = new Criteria();
criteria.andOperator(
            Criteria.where(Constants.VERSION).is(Constants.V2),
            Criteria.where(Constants.STYLEID).in(Lists.newArrayList(looksRequestV2.getStyleId().intValue()))
            // Criteria.where(Constants.STYLEID).is(looksRequestV2.getStyleId().intValue())
            // Criteria.where(Constants.STYLEID).is(looksRequestV2.getStyleId())
);