हम $type
का इस्तेमाल नहीं कर सकते
ऑपरेटर हमारे दस्तावेज़ों को यहाँ फ़िल्टर करेगा क्योंकि हमारे सरणी में तत्वों का प्रकार "स्ट्रिंग" है और जैसा कि दस्तावेज़ीकरण में बताया गया है:
लेकिन सौभाग्य से MongoDB $exists
. भी प्रदान करता है ऑपरेटर जिसका उपयोग यहां संख्यात्मक सरणी अनुक्रमणिका के साथ किया जा सकता है।
अब हम उन दस्तावेज़ों को कैसे अपडेट कर सकते हैं?
ठीक है, MongoDB संस्करण <=3.2 से, हमारे पास एकमात्र विकल्प है mapReduce()
लेकिन पहले MongoDB की आगामी रिलीज़ में दूसरे विकल्प को देखें।
MongoDB 3.4 से शुरू करके, हम $project
कर सकते हैं
हमारे दस्तावेज़ और $split
. का उपयोग करें ऑपरेटर हमारे स्ट्रिंग को सबस्ट्रिंग की एक सरणी में विभाजित करने के लिए।
ध्यान दें कि केवल उन "टैग" को विभाजित करने के लिए जो स्ट्रिंग हैं, हमें एक तार्किक की आवश्यकता है। $cond
केवल स्ट्रिंग वाले मानों को विभाजित करने के लिए ion प्रसंस्करण। यहां शर्त है $eq
जो सत्य
. का मूल्यांकन करते हैं जब $type
फ़ील्ड का "string"
. के बराबर है . वैसे $type
यहाँ 3.4 में नया है।
अंत में हम $out
पाइपलाइन चरण ऑपरेटर। लेकिन हमें $project
. में अन्य फ़ील्ड के समावेश को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है मंच ।
db.collection.aggregate(
[
{ "$project": {
"tags": {
"$cond": [
{ "$eq": [
{ "$type": "$tags" },
"string"
]},
{ "$split": [ "$tags", " " ] },
"$tags"
]
}
}},
{ "$out": "collection" }
]
)
mapReduce
. के साथ , हमें Array का उपयोग करने की आवश्यकता है। प्रोटोटाइप.स्प्लिट ()
हमारे मैप फ़ंक्शन . में सबस्ट्रिंग की सरणी को उत्सर्जित करने के लिए . हमें "क्वेरी" विकल्प का उपयोग करके अपने दस्तावेज़ों को फ़िल्टर करने की भी आवश्यकता है। वहां से हमें "परिणाम" सरणी और $set
. को पुनरावृत्त करना होगा बल्कराइट ()
3.2 में नया तरीका या अब बहिष्कृत Bulk()
अगर हम 2.6 या 3.0 पर हैं जैसा कि दिखाया गया है यहां।
db.collection.mapReduce(
function() { emit(this._id, this.tags.split(" ")); },
function(key, value) {},
{
"out": { "inline": 1 },
"query": {
"tags.0": { "$exists": false },
"tags": { "$type": 2 }
}
}
)['results']