Не удалось перевести Stream(BSONDocument(‹non-empty›) в BSONDocument

Я пытаюсь использовать Aggregate в ReactiveMongo, но получаю странную ошибку.

Я создаю команду Aggregate следующим образом:

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?


person jakob    schedule 04.07.2014    source источник


Ответы (1)


Ваша проблема в том, что ваш результат не Stream[BSONDocument], а Success[ErrorType, Stream[BSONDocument]].

Итак, ваш result.map делает карту на Success (держу пари, это scalaz.Success?), а не на Stream. Из-за этого ваша переменная 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 — это коллекция, поэтому в нем есть несколько BSONDocument, и если вы хотите свернуть его в один объект BSONDocument, вам потребуется выполнить одну из операций сворачивания (fold, foldLeft, foldRight). потока.

Для получения дополнительной информации см.: http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Stream

person regexp    schedule 04.07.2014