/ / ReactiveMongo + Play 2: एक उप दस्तावेज़ (सरणी) स्ट्रीम करें

ReactiveMongo + Play 2: एक उप दस्तावेज़ (सरणी) स्ट्रीम करें - mongodb, scala, stream, playframework-2.3, reactivemongo

निम्नलिखित उदाहरण में, मैं उपयोग कर रहा हूं:

  • MongoDB (> WiredTiger इंजन के साथ 3.0)
  • स्काला में 2.3.8 फ्रेमवर्क खेलें
  • Org.reactivemongo: play2-reactivemongo: 0.11.0.play23-M3

सबसे पहले, मान लें कि हमारे पास MongoDB संग्रह में निम्नलिखित दस्तावेज़ हैं, उदाहरण के लिए "urlColl":

{
"_id" : ObjectId("5593bebe89645672000deec4"),
"url" : "urlPath",
"content" : [
"a",
"ab",
"abc",
"abcd"
]}

Play में, निम्न दस्तावेजों को "urlColl" संग्रह में डालने के साथ ही Play में निम्नलिखित विधि के साथ, नए दस्तावेज़ों को स्ट्रीम करना संभव है।

def feed = Action {
val cursor = collection
.find(BSONDocument(), BSONDocument("content" -> 1))
.options(QueryOpts().tailable.awaitData)
.cursor[List[Try[BSONValue]]](ReadPreference.nearest)

val dataProducer = cursor.enumerate(Int.MaxValue).map(_.toString)
Ok.chunked(dataProducer &> EventSource()).as("text/event-stream")
}

और निहित पाठक:

implicit object ContentToList extends BSONDocumentReader[List[Try[BSONValue]]] {
def read(doc: BSONDocument): List[Try[BSONValue]] = {
doc.getAs[BSONArray]("content").get.stream.toList
}
}

फिर, हर बार "सामग्री" सरणी के साथ एक नया दस्तावेज़ डाला जाता है, यह स्वचालित रूप से क्लाइंट को भेजा जाता है।

मेरा प्रश्न काफी सरल है:

क्या क्लाइंट को "सामग्री" उप सरणी में इंजेक्ट किए गए नए डेटा को स्ट्रीम करना संभव है?

वास्तव में, चूंकि कोई नया दस्तावेज़ नहीं डाला गया है (मौजूदा दस्तावेज़ की सरणी में एक नया मान डाला गया है), कर्सर में कुछ भी नहीं पाया गया है और ग्राहक को एक फ़ॉर्किरी कुछ भी नहीं भेजा गया है।

आपका अग्रिम में ही बहुत धन्यवाद!


@cchantep, आपकी पिछली टिप्पणी का जवाब देने के लिए:

हां, मुझे कुछ धीमे प्रश्नों का सामना करना पड़ रहा है। वास्तव में, मेरे पास एक वेब पेज है जिसका उपयोग डेटा को पुश करने के लिए किया जाता है, और एक अन्य वेब पेज जहां सर्वर घटनाओं को भेजता है।

पहले पेज के फॉर्म को सत्यापित करने में 3 सेकंड तक का समय लग सकता है। मैंगो लॉग में, मैं देख सकता हूं:

I QUERY    [conn329] getmore test.events cursorid:22982535122 ntoreturn:0
keyUpdates:0 writeConflicts:0 numYields:0 nreturned:1 reslen:86
locks:{ Global: { acquireCount: { r: 1000 } }, Database: { acquireCount:
{ r: 1000 } }, Collection: { acquireCount: { r: 1000 } } } 2783ms.

यह टैब्लेट कर्सर के कारण इवेंट कलेक्शन (2783ms) का एक लॉग है। शायद यह समस्या का कारण बन सकता है?

संपादित करें: मैंने टैब्लेट कर्सर (coll.find (चयनकर्ता) .options (QueryOpts ()। Tailable.awaitData)) को अक्षम कर दिया है और प्रदर्शन बहुत बेहतर हैं। क्या तुम्हारे पास कोई विचार है?

धन्यवाद!

उत्तर:

जवाब के लिए 0 № 1

अंतिम 0.11.0 की रिलीज के रूप में उपलब्ध है "org.reactivemongo" %% "play2-reactivemongo" % "0.11.0.play23".

उप-सरणी के बारे में, में जख्मी अभिशापMongoDB (न केवल ReactiveMongo के साथ) नए शीर्ष-दस्तावेज़ की निगरानी कर रहे हैं। चूंकि आपके दस्तावेज़ को एरे प्रॉपर्टी में एक तत्व जोड़ने के लिए अपडेट किया गया है, इसलिए इसे बनाते समय कर्सर स्ट्रीम में पहले ही वापस कर दिया गया है।

यदि आप ईवेंट स्रोत को लागू करना चाहते हैं, तो एक इकाई संग्रह (स्नैपशॉट संग्रह) के बजाय एक ईवेंट संग्रह पर उपलब्ध कर्सर को रोकना बेहतर होगा।

आप एक नमूना प्ले ऐप का उपयोग करके पा सकते हैं EventSource साथ में मानगो नॉकआउट खेलें.