0

我正在尝试在 ReactiveMongo 中使用聚合,但我遇到了一个奇怪的错误。

我创建一个这样的聚合命令:

val command = Aggregate("invites", Seq(
      Match(BSONDocument("origin" -> 1, "status" -> 3, "created" -> BSONDocument("$gte" -> from.getMillis, "$lt" -> to.getMillis))),
      Sort(List(reactivemongo.core.commands.Ascending("_id"))),
      Group(BSONDocument("myId" -> "$venues.myId", "name" -> "$venues.name"))("count" -> SumValue(1))
    ))

打电话给蒙哥:

val result = collection.db.command(command)

这将返回一个成功的流:

Success(Stream(BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>), BSONDocument(<non-empty>)))

然后我尝试将流转换为 BSONDocument:

result.map { doc =>
      val bson = doc.asInstanceOf[BSONDocument]
      Logger.info(BSONDocument.pretty(bson))
      bson
    }

但我得到:

    Failure(java.lang.ClassCastException: scala.collection.immutable.Stream$Cons cannot be cast to reactivemongo.bson.BSONDocument)

scala.collection.immutable.Stream$Cons cannot be cast to reactivemongo.bson.BSONDocument

为了解决这个问题,让我们使用 Json lib:

val doc = result.map { Json.toJson(_) }

这给了我:

    [
    {
        "_id": {
            "myId": [
                3111669
            ],
            "name": [
                "Some cool name 1"
            ]
        },
        "count": 3
    },
    {
        "_id": {
            "myId": [
                3091695
            ],
            "name": [
                "Some cool name 2"
            ]
        },
        "count": 19
    },
    {
        "_id": {
            "myId": [
                896
            ],
            "name": [
                "Coole name"
            ]
        },
        "count": 1
    },
    {
        "_id": {
            "myId": [
                933
            ],
            "name": [
                "BALBLABLBL"
            ]
        },
        "count": 1
    },
    {
        "_id": {
            "myId": [
                3000831
            ],
            "name": [
                "Cleaning Services"
            ]
        },
        "count": 2
    },
    {
        "_id": {
            "myId": [
                3389731
            ],
            "name": [
                "Car company number uno"
            ]
        },
        "count": 5
    }
]

成功!所以我的问题是。我应该如何将我的流转换为 BSONDocument 而不是 json 值?

4

1 回答 1

1

您的问题是,您的结果不是 a Stream[BSONDocument],而是 a Success[ErrorType, Stream[BSONDocument]]

所以你result.map的地图是成功的(我敢打赌这是scalaz.Success?)而不是流。因此,您doc在 map 函数中的变量是Stream[BSONDocument]而不是BSONDocument(显然您不能将 Stream 转换为 BSONDocument)

如果你想访问 BSONDocuments,你必须这样做:

result match {
  case Failure(error) => throw new Exception("") // handle the error somehow
  case Success(stream) => stream map { doc => ... }
}

重要的是要知道 Stream 是一个集合,因此其中有多个 BSONDocument,如果要将其折叠到一个 BSONDocument 对象中,则需要 Stream 的折叠操作之一(fold、foldLeft、foldRight)。

有关详细信息,请参阅:http ://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Stream

于 2014-07-04T09:58:25.500 回答