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

अंतिम सरणी मान पर क्वेरी

यहां मुख्य बात है एग्रीगेशन $slice सरणी से अंतिम तत्व प्राप्त करने के लिए,

db.chat.aggregate([
 { "$match": { "user1": 1,  "messages.capty": "B" } },
 { "$redact": {
   "$cond": {
     "if": { 
       "$eq": [ { "$slice": [ "$messages.capty", -1 ] }, ["B"] ]  
     },
     "then": "$$KEEP",
     "else": "$$PRUNE"
   }
 }},
 { "$project": {
   "user2": 1,
   "body": {
     "$arrayElemAt": [
       { "$map": {
         "input": { 
           "$filter": {
             "input": { "$slice": [ "$messages",-1 ] },
             "as": "m",
             "cond": { "$eq": [ "$$m.capty", "B" ] }
           }
         },
         "as": "m",
         "in": "$$m.body"
       }},
       0
     ]
   }
 }}
])

मैं वास्तव में $project चरण के साथ $filter लेकिन यह सब मूल रूप से एक ही है।

पहले क्वेरी दस्तावेज़ों का चयन करती है, हम वास्तव में इस बिंदु पर "केवल" सरणी के अंतिम तत्व से मेल खाने के लिए नहीं कह सकते हैं, लेकिन हम उन दस्तावेज़ों को फ़िल्टर करना चाहते हैं जिनकी सरणी पर बिल्कुल भी शर्त नहीं है।

$redact वास्तविक चीज़ है जो "अंतिम" सरणी प्रविष्टि को देखती है और फ़ील्ड के मान का परीक्षण करती है। हम सरणी से केवल फ़ील्ड को $messages.capty . द्वारा नोट कर सकते हैं जो उन वस्तुओं की सिर्फ एक सरणी देता है। यहां हम $slice या यहां तक ​​कि $arrayElemAt यदि आप -1 . की अनुक्रमणिका होने के नाते अंतिम मान प्राप्त करना चाहते हैं ।

इस बिंदु पर हम केवल "दस्तावेजों" को "फ़िल्टर" करते हैं जो शर्त से मेल नहीं खाते। अंतिम $project चरण सरणी के अंतिम तत्व को लेता है, जांचता है कि यह उस स्थिति से मेल खाता है (जो इसे पहले के चरणों में होना चाहिए), "body" का मान निकालता है और एकल सरणी सामग्री को केवल सादा मान में बदल देता है।

आप वैकल्पिक रूप से "सावधानी" को छोड़ सकते हैं और $redact के बाद से बस अंतिम सरणी तत्व को पकड़ सकते हैं अपना काम करना चाहिए था:

db.chat.aggregate([
 { "$match": { "user1": 1,  "messages.capty": "B" } },
 { "$redact": {
   "$cond": {
     "if": { 
       "$eq": [ { "$arrayElemAt": [ "$messages.capty", -1 ] }, "B" ]  
     },
     "then": "$$KEEP",
     "else": "$$PRUNE"
   }
 }},
 { "$project": {
   "user2": 1,
   "body": {
     "$arrayElemAt": [ "$messages.body", -1 ]
   }
 }}
])

पूरी बात वास्तव में "संभव से मेल खाने के लिए टूट जाती है एक क्वेरी के साथ दस्तावेज़" और फिर "अंतिम तत्व की तुलना करें और निकालें $slice या $arrayElemAt ".

परिणाम हैं:

{
        "_id" : ObjectId("593921425ccc8150f35e7663"),
        "user2" : 3,
        "body" : "hiii 23"
}
{
        "_id" : ObjectId("593921425ccc8150f35e7664"),
        "user2" : 4,
        "body" : "hiii 24"
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. डेटा को एक मॉडल से दो में विभाजित करने के बाद मैं अपनी नेवला क्वेरी को फिर से कैसे लिख सकता हूं?

  2. मोंगो-स्कैला-ड्राइवर का उपयोग करके स्काला में मोंगोडब से मुद्रण क्वेरी परिणाम

  3. MongoDB में डेटा वर्जनिंग को लागू करने के तरीके

  4. क्या मोंगोडब रीइंडेक्स करता है यदि आप उस फ़ील्ड को बदलते हैं जिसका उपयोग इंडेक्स में किया जाता है?

  5. बहुविकल्पीय प्रश्नों और उत्तरों के लिए MongoDB स्कीमा डिज़ाइन