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

मोंगोडब बहु नेस्टेड सरणी खोज

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

db.collection.aggregate([
    { "$match": { "data.userid": 1 } },
    { "$project": {
        "data": {
            "$setDifference": [
                { "$map": {
                    "input": "$data",
                    "as": "el",
                    "in": { 
                        "$cond": [
                            { "$setIsSubset": [ [1], "$$el.userid" ] },
                            "$$el",
                            false
                        ]
                    }
                }},
                [false]
            ]
        }
    }},
    { "$match": { "data.0": { "$exists": true } }}
])

PHP के साथ यह निम्नानुसार नोट करता है:

$collection->aggregate(array(
    array( '$match' => array( "data.userid" => 1 )),
    array(
        '$project' => array(
            'data' => array(
                '$setDifference' => array(
                    array(
                        '$map' => array(
                            'input' => '$data',
                            'as' => 'el',
                            'in' => array(
                                '$cond' => array(
                                    array( '$setIsSubset' => array(array(1),'$$el.userid') ),
                                    '$$el',
                                    FALSE
                                )
                            )
                        )
                    ),
                    array(FALSE)
                )
            )
        )
    ),
    array( '$match' => array( 'data.0' => array( '$exists' => TRUE ) ) )
))

$map ऑपरेटर बाहरी सरणी के प्रत्येक तत्व के निरीक्षण की अनुमति देता है और प्रत्येक तत्व को <मजबूत>$cond टर्नरी ऑपरेशन। यह एक $setIsSubset को प्रोसेस करता है "आंतरिक" सरणी पर ऑपरेशन यह देखने के लिए कि क्या वास्तव में वैकल्पिक सेट में मानों में से एक है (इस मामले में [1] ) और जहां true मूल्यांकन किया जाता है तो तत्व वापस कर दिया जाता है या अन्यथा false

$setDifference की बात उन false को हटाना है संशोधित सरणी से मान और केवल मिलान किए गए तत्व लौटाएं। और अंत में $exists परीक्षण यह देखने के लिए दिखता है कि बाहरी सरणी में वास्तव में कम से कम एक तत्व है और फ़िल्टरिंग के परिणामस्वरूप खाली नहीं है।

लौटाए गए दस्तावेज़ वे हैं जो मिलान की स्थिति वाले हैं और केवल सरणी तत्व हैं जो निर्दिष्ट स्थिति से मेल खाते हैं।

बेशक यहां ऑपरेटरों को सर्वर के रूप में कम से कम MongoDB 2.6 की आवश्यकता होती है (जो अब काफी पुरानी रिलीज है और कम से कम एक सलाह दी गई अपडेट है) लेकिन यदि आपके पास अभी भी एक कम संस्करण है तो आपको $unwind और $group :

$collection->aggregate(array(
    array( '$match' => array( "data.userid" => 1 )),
    array( '$unwind' => '$data' ),
    array( '$match' => array( 'data.userid' => 1 )),
    array( 
        '$group' => array(
            '_id' => '$_id',
            'data' => array( '$push' => '$data' )
        )
    )
))



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. जांच कर रहा है कि मोंगोडब में कोई इंडेक्स मौजूद है या नहीं

  2. MongoDB:डुप्लिकेट कुंजी अपडेट पर डालें

  3. आर सूची को JSON में कनवर्ट करना

  4. मैक ओएसएक्स 10.8 . को सीमित करें

  5. MongooseJS/MongoDB सटीक वाक्यांश खोजें