0

我正在尝试以java.time.Instantmongo 的本机Date格式存储。

官方 ReactiveMongo 文档指出日期时间应序列化为

JsObject with a $date JsNumber field with the timestamp (milliseconds) as value

在此处输入图像描述

http://reactivemongo.org/releases/1.0/documentation/json/overview.html

我遵循此规则,但该值不存储为 mongo's Date,而是存储为常规 JSON (BSON) 文档:

{
    "_id" : ObjectId("6057b962af0000af00e81ec7"),
    "username" : "john",
    "createdAt" : {
        "$date" : NumberLong(1616361826198)
    }
}

存储文档的 Scala 源代码:

import play.api.libs.json.Json
import reactivemongo.api.DB
import reactivemongo.api.bson.BSONObjectID
import reactivemongo.api.bson.collection.BSONCollection
import java.time.Instant
import scala.concurrent.{ ExecutionContext, Future }
import reactivemongo.play.json.compat._
import json2bson._
import reactivemongo.api.commands.WriteResult

class Repo(database: DB)(implicit ec: ExecutionContext) {

  def collection: BSONCollection =
    database.collection("users")

  def insertDocument(): Future[WriteResult] = {
    val doc = Json.obj(
      "_id"       -> BSONObjectID.generate(),
      "username"  -> "john",
      "createdAt" -> Json.obj("$date" -> Instant.now().toEpochMilli)
    )

    collection.insert.one(doc)
  }
}

这里有什么问题?

PS:

如果我更改扩展 BSON 语法

Json.obj("$date" -> Instant.now().toEpochMilli)

BSONDateTime

  ...
  "createdAt" -> BSONDateTime(Instant.now().toEpochMilli)
  ...

有用。

但是,为什么它不能与 play JSON + 扩展语法一起使用?

4

1 回答 1

1

MongoDB JSON 扩展表示不是date 的有效 v2表示。该$date值必须是格式化字符串或长{"$numberLong": "<millis>"}

scala> BSONValue.pretty(implicitly[BSONValue](Json.obj("$date" -> Instant.now().toEpochMilli)))
res12: String =
{
  '$date': NumberLong(1616415630059)
}

scala> BSONValue.pretty(implicitly[BSONValue](Json.obj("$date" -> Instant.now().toString)))
res13: String = ISODate('2021-03-22T12:20:37.571Z')

scala> BSONValue.pretty(implicitly[BSONValue](Json.obj("$date" -> Json.obj("$numberLong" -> Instant.now().toEpochMilli.toString))))
res16: String = ISODate('2021-03-22T12:21:48.843Z')

话虽如此,使用 JSON 来表示内部查询(没有来自其他地方的 JSON 值,例如 REST API)是无用的,而且成本很高。

需要时,确保拥有所有必需的导入(如那个extended._)。

于 2021-03-22T12:23:44.160 回答