MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB सूचियाँ - हर Nth आइटम प्राप्त करें

ऐसा लगता है कि आपका प्रश्न स्पष्ट रूप से पूछा गया "हर nth उदाहरण प्राप्त करें" जो एक बहुत स्पष्ट प्रश्न की तरह प्रतीत होता है।

क्वेरी ऑपरेशन जैसे .find() प्रोजेक्शन में सामान्य क्षेत्र "चयन" के अपवाद और स्थितीय $ मैच ऑपरेटर या $elemMatch जो एकवचन मिलान वाले सरणी तत्व की अनुमति देता है।

बेशक, $slice है , लेकिन यह केवल सरणी पर "श्रेणी चयन" की अनुमति देता है, इसलिए फिर से लागू नहीं होता है।

सर्वर पर परिणाम को संशोधित करने वाली "केवल" चीजें हैं .aggregate() और .mapReduce() . पूर्व किसी भी तरह से "स्लाइसिंग" सरणियों के साथ "बहुत अच्छा नहीं खेलता", कम से कम "एन" तत्वों द्वारा नहीं। हालांकि चूंकि mapReduce के "फ़ंक्शन ()" तर्क जावास्क्रिप्ट आधारित तर्क हैं, तो आपके पास खेलने के लिए थोड़ा और कमरा है।

विश्लेषणात्मक प्रक्रियाओं के लिए, और विश्लेषणात्मक उद्देश्यों के लिए "केवल" फिर .filter() :

db.collection.mapReduce(
    function() {
        var id = this._id;
        delete this._id;

        // filter the content of "instances" to every 3rd item only
        this.instances = this.instances.filter(function(el,idx) {
            return ((idx+1) % 3) == 0;
        });
        emit(id,this);
    },
    function() {},
    { "out": { "inline": 1 } } // or output to collection as required
)

यह वास्तव में इस बिंदु पर सिर्फ एक "जावास्क्रिप्ट रनर" है, लेकिन अगर यह सिर्फ एनालिसिस/परीक्षण के लिए है तो अवधारणा में आम तौर पर कुछ भी गलत नहीं है। बेशक आउटपुट "बिल्कुल" नहीं है कि आपका दस्तावेज़ कैसे संरचित है, लेकिन यह एक प्रतिकृति के करीब है जैसा कि mapReduce प्राप्त कर सकता है।

अन्य सुझाव जो मुझे यहां दिखाई दे रहे हैं, उन्हें सभी आइटम "डिनॉर्मलाइज़्ड" के साथ एक नया संग्रह बनाने और unqique _id के हिस्से के रूप में सरणी से "इंडेक्स" डालने की आवश्यकता है। चाभी। यह कुछ ऐसा उत्पन्न कर सकता है जिसे आप सीधे पूछ सकते हैं, "हर nth आइटम" के लिए आपको अभी भी करना होगा:

db.resultCollection.find({
     "_id.index": { "$in": [2,5,8,11,14] } // and so on ....
})

इसलिए वर्कआउट करें और "हर nth आइटम" प्राप्त करने के लिए "हर nth आइटम" का इंडेक्स वैल्यू प्रदान करें। ताकि वास्तव में उस समस्या का समाधान न हो जो पूछी गई थी।

यदि आउटपुट फॉर्म आपके "परीक्षण" उद्देश्यों के लिए अधिक वांछनीय लग रहा था, तो उन परिणामों पर एक बेहतर अनुवर्ती क्वेरी एग्रीगेशन पाइपलाइन का उपयोग करेगी, जिसमें $redact

db.newCollection([
    { "$redact": {
        "$cond": {
            "if": {
                "$eq": [ 
                    { "$mod": [ { "$add": [ "$_id.index", 1] }, 3 ] },
                0 ]
            },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}
])

यह कम से कम एक "तार्किक स्थिति" का उपयोग करता है, जैसा कि .filter() . के साथ लागू किया गया था क्वेरी तर्क के रूप में सभी संभावित अनुक्रमणिका मानों को सूचीबद्ध किए बिना केवल "nth अनुक्रमणिका" आइटम का चयन करने से पहले।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. NoSQL रुझान - MongoDB, Cassandra, CouchDB और Riak

  2. स्थानीयहोस्ट पर उल्का मोंगो का उपयोग करना लेकिन दूरस्थ डेटाबेस के साथ

  3. WiredTiger.turtle अनुमतियों के कारण Mongodb प्रारंभ नहीं हो सकता

  4. मोंगो उन दस्तावेजों को ढूंढता है जहां सरणी में दिए गए सरणी के x मान होते हैं

  5. MongoDB:रिकॉर्ड के लिए क्वेरी कैसे करें जहां फ़ील्ड शून्य है या सेट नहीं है?