【问题标题】:Not able to translate Stream(BSONDocument(<non-empty>) to a BSONDocument无法将 Stream(BSONDocument(<non-empty>) 转换为 BSONDocument
【发布时间】:2014-08-25 14:10:14
【问题描述】:

我正在尝试在 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))
    ))

调用mongo:

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 值?

【问题讨论】:

    标签: scala playframework-2.0 reactivemongo


    【解决方案1】:

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

    所以你的result.map 绘制成功(我敢打赌这是scalaz.Success?)而不是Stream。因此,map 函数中的 doc 变量是 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是一个集合,所以你有多个BSONDocuments,如果你想将它折叠成一个BSONDocument对象,你需要一个折叠操作(fold,foldLeft , foldRight) 的流。

    欲了解更多信息,请参阅:http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Stream

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多