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

दो-स्तरीय अज्ञात मूल कुंजी के साथ मोंगो क्वेरी नेस्टेड फ़ील्ड मान

मैप रिड्यूस आपको नामित कुंजियों को संसाधित करने की अनुमति देता है, लेकिन कुशल प्रश्नों के लिए एकत्रीकरण एक तरीका है।

आपको डेटा को एकत्रीकरण ढांचे के लिए एम्बेडेड दस्तावेज़ों की सरणी के रूप में मॉडल करना होगा।

मैंने आपको दो विकल्प दिए हैं। आप अपने डेटासेट के लिए उनका परीक्षण कर सकते हैं और देख सकते हैं कि कौन सा आपके लिए बेहतर काम करता है।

कुछ इस तरह

"v":[
  {
    "minute":1,
    "seconds":[
      {
        "second":54,
        "data":{
         "field1":7.373158,
         "entry_id":4635,
         "field3":0.19,
         "field2":88
       }
      }
    ]
  },
  {
    "minute":2,
    "seconds":...
  }
]

अब आप उन वस्तुओं के लिए आसानी से क्वेरी कर सकते हैं जिनमें सेंसर रीडिंग है:"फ़ील्ड 1"> 2।

db.col.aggregate(
  [{"$match":{"v.seconds.data.field1":{"$gt":2}}},
   {"$unwind":"$v"}, 
   {"$match":{"v.seconds.data.field1":{"$gt":2}}},
   {"$unwind":"$v.seconds"}, 
   {"$match":{"v.seconds.data.field1":{"$gt":2}}},
   {"$project":{"data":"$v.seconds.data"}}]
)

वैकल्पिक रूप से, आप दस्तावेज़ों को मिनटों में विभाजित कर सकते हैं। कुछ इस तरह

"v":[
  {
    "second":1,
    "data":{
       "field1":7.373158,
       "entry_id":4635,
       "field3":0.19,
       "field2":88
     }
  },
  {
     "second":2,
     "data":...
  }
]

अब आप क्वेरी कर सकते हैं जैसे (v.data.field1 पर अनुक्रमणिका के साथ)

db.col.aggregate(
  [{"$match":{"v.data.field1":{"$gt":2}}},
   {"$unwind":"$v"}, 
   {"$match":{"v.data.field1":{"$gt":2}}},
   {"$project":{"data":"$v.data"}}]
)

आप उन आइटम को क्वेरी कर सकते हैं जिनमें सेंसर रीडिंग है:"field1">2 और "field3">5

पहली संरचना का उपयोग करना

db.col.aggregate(
  [{"$match":{"v":{"$elemMatch":{"seconds": {$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}}}},
  {"$unwind":"$v"}, 
    {"$match":{"v.seconds": {$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}},
  {"$unwind":"$v.seconds"}, 
  {"$project":{"data":"$v.seconds.data"}}]
)

दूसरी संरचना का उपयोग करना

db.col.aggregate(
  [{"$match":{"v.data":{$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}},
  {"$unwind":"$v"}, 
  {"$match":{"v.data.field1":{"$gt":2},"v.data.field3":{"$gt":5} }},
  {"$project":{"data":"$v.data"}}]
)

मोंगो अपडेट 3.6

$match $expr . के साथ जो एकत्रीकरण अभिव्यक्ति को स्वीकार करता है।

$gt > 0 - एग्रीगेशन एक्सप्रेशन यह जांचने के लिए कि एक मिनट में सभी मिलान सेकंड मानदंड का योग 0 से अधिक कहां है

$objectToArray नामित कुंजियों को कुंजी मान युग्म में बदलने के लिए उसके बाद $filter इनपुट मानदंड पर सेकंड और मिलान सेकंड रिकॉर्ड की आउटपुट संख्या।

db.testcol.aggregate(
{"$match":{
  "$expr":{
    "$gt":[
      {"$sum":{
        "$map":{
          "input":{"$objectToArray":"$v"},
          "as":"secondsofminute",
          "in":{
            "$size":{
              "$filter":{
                "input":{"$objectToArray":"$$secondsofminute.v"},
                "as":"seconds",
                "cond":{"$gt":["$$seconds.v.field2",2]}
              }
            }
          }
        }
      }},
    0]
  }
}})

मोंगो अपडेट 3.4 - बदलें $expr $redact . के साथ

db.col.aggregate(
 {"$redact":{
  "$cond":{
    "if":{
      "$gt":[
        {"$sum":{
          "$map":{
            "input":{"$objectToArray":"$v"},
            "as":"secondsofminute",
            "in":{
              "$size":{
                "$filter":{
                  "input":{"$objectToArray":"$$secondsofminute.v"},
                  "as":"seconds",
                  "cond":{"$gt":["$$seconds.v.field2",2]}
                }
              }
            }
          }
        }},
        0]
    },
   "then":"$$KEEP",
   "else":"$$PRUNE"
  }
}})



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. PHP में MongoDB foreach क्वेरी को कैसे कोड करें?

  2. मोंगो:होस्ट पर 'whatsmyuri' कमांड चलाने का प्रयास करते समय नेटवर्क त्रुटि

  3. बिना लुकअप के मोंगो में दो संग्रह कैसे जुड़ें?

  4. मोंगोडीबी को मोबाइल या ब्राउज़र आधारित एप्लिकेशन से जोड़ना

  5. Node.js का उपयोग करके mongoDB के विशिष्ट क्षेत्रों को क्वेरी करें