/ / स्ट्रीम करने के लिए सक्षम नहीं है (BSONDocument (<गैर-खाली>) एक BSONDocument के लिए - scala, playframework-2.0, reactivemongo

स्ट्रीम (बीएसओएनडीओमेंट (<non-blank>) को बीएसओएनडी दस्तावेज़ में अनुवाद करने में सक्षम नहीं है - स्कैला, playframework-2.0, reactivemongo

मैं 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 के उपयोग को गलत करें:

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
}
]

सफलता! तो मेरा सवाल है मुझे json मान के बजाय अपनी स्ट्रीम को BSondocument में कैसे अनुवाद करना चाहिए?

उत्तर:

उत्तर № 1 के लिए 1

आपकी समस्या यह है कि आपका परिणाम isn "t a Stream[BSONDocument], लेकिन ए Success[ErrorType, Stream[BSONDocument]].

तो आपका result.map सफलता पर नक्शा करता है (मैं शर्त लगाता हूं कि यह स्केलज़ है। असफल?) और स्ट्रीम पर नहीं। इस वजह से आपकी doc मानचित्र समारोह में परिवर्तनशील है Stream[BSONDocument] और नहीं BSONDocument (और स्पष्ट रूप से आप "एक स्ट्रीम को बीएसंडक्लाइम नहीं कर सकते हैं)"

यदि आप BSondocuments का उपयोग करना चाहते हैं, तो आपको कुछ इस तरह करना होगा:

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

यह जानना महत्वपूर्ण है कि स्ट्रीम एक है संग्रह, इसलिए आपके पास इसमें कई BSondocuments हैं और यदि आप इसे एक BSONDocument ऑब्जेक्ट में बदलना चाहते हैं, तो आपको स्ट्रीम के किसी भी गुना ऑपरेशन (गुना, foldLeft, foldRight) की आवश्यकता होगी।

अधिक जानकारी के लिए देखें: http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Stream