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

Mongodb में जटिल सशर्त छँटाई करने के लिए एकत्रीकरण का उपयोग करना

सबसे पहले, ध्यान दें कि आपका सॉर्ट उदाहरण विकृत है:कुल विधि इनपुट के रूप में एक सरणी लेती है, जहां सरणी में प्रत्येक तत्व एकत्रीकरण पाइपलाइन में एक चरण निर्दिष्ट करता है। साथ ही, ध्यान दें कि $elemMatch $सॉर्ट चरण के भाग के रूप में ऑपरेटर का उपयोग नहीं किया जा सकता है।

आप अपने सॉर्ट उदाहरण के साथ जो करने का प्रयास कर रहे हैं उसे प्राप्त करने का एक तरीका एकत्रीकरण ढांचे के $खोलें पाइपलाइन ऑपरेटर। किसी ऐरे को खोलने से ऐरे के तत्वों को एक-एक करके अलग-अलग दस्तावेज़ों में खोल दिया जाएगा। उदाहरण के लिए, निम्न क्वेरी

db.my_collection.aggregate([ {$unwind: "$answers"} ]);

निम्न जैसा कुछ लौटाता है:

[
    {
        "_id" : ObjectId("5237157f3fac8e36fdb0b96e"),
        "user" : "bruno",
        "answers" : {
            "id" : 0,
            "value" : 3.5
        }
    },
    {
        "_id" : ObjectId("5237157f3fac8e36fdb0b96e"),
        "user" : "bruno",
        "answers" : {
            "id" : 1,
            "value" : "hello"
        }
    },
    {
        "_id" : ObjectId("523715813fac8e36fdb0b96f"),
        "user" : "bruno2",
        "answers" : {
            "id" : 0,
            "value" : 0.5
        }
    },
    {
        "_id" : ObjectId("523715813fac8e36fdb0b96f"),
        "user" : "bruno2",
        "answers" : {
            "id" : 1,
            "value" : "world"
        }
    }
]

एक $match चरण जोड़ने से आप केवल उन्हीं दस्तावेज़ों को प्राप्त कर सकेंगे जहाँ answer.id शून्य है। अंत में, एक $sort चरण आपको answer.value द्वारा क्रमबद्ध करने की अनुमति देता है। सभी एक साथ एकत्रीकरण क्वेरी है:

db.my_collection.aggregate([
    {$unwind: "$answers"},
    {$match: {"answers.id": 0}},
    {$sort: {"answers.value": -1}}
]);

और आउटपुट:

[
    {
        "_id" : ObjectId("5237157f3fac8e36fdb0b96e"),
        "user" : "bruno",
        "answers" : {
            "id" : 0,
            "value" : 3.5
        }
    },
    {
        "_id" : ObjectId("523715813fac8e36fdb0b96f"),
        "user" : "bruno2",
        "answers" : {
            "id" : 0,
            "value" : 0.5
        }
    }
]

आपके पूछने के आधार पर, ऐसा नहीं लगता कि आपको हमेशा $unwind या यहां तक ​​कि एकत्रीकरण ढांचे की आवश्यकता होगी। यदि इसके बजाय आप दस्तावेज़ को answer.id के साथ 0 के बराबर और answer.value 3.5 के बराबर ढूंढना चाहते हैं, और फिर answer.value को 4 में बदलना चाहते हैं, तो आप $elemMatch के साथ db.collection.save():

doc = db.my_collection.findOne({"answers": {$elemMatch: {"id": 0, "value": 3.5}}});
for (i=0; i<doc.answers.length; i++) {
  if (doc.answers[i].id === 0) {
    doc.answers[i].value = 4;
    db.my_collection.save(doc);
    break;
  }
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. उपयोगकर्ता अनुयायियों/अनुयायियों की सबसे कुशल पूछताछ के लिए एक अच्छी MongoDB दस्तावेज़ संरचना क्या है?

  2. मैं नेस्टेड दस्तावेज़ों के लिए एकत्रीकरण पाइपलाइन में खोलना चरणों को कैसे कम कर सकता हूं?

  3. और ऑपरेटर mongoosastic (फ़िल्टर)

  4. मोंगो में डेटाबेस बनाना:कनेक्ट नहीं हो सकता, कनेक्ट विफल हो गया

  5. Mongo-PHP - MongoDB PHP ड्राइवर v1.6 . के साथ MongoCursor अपवाद