2011-07-08 7 views
6

मैं यह जानने की कोशिश कर रहा हूं कि प्रत्येक ज़िप कोड में कितने रिकॉर्ड हैं I
मेरे मोंगोडीबी में, ज़िप कोड एम्बेड किया गया है; डॉट नोटेशन का उपयोग करके, यह a.res.z पर स्थित है (पता के लिए, आवासीय के लिए res, ज़िप के लिए z)। उदाहरण के लिए, यह सिर्फ ठीक काम करता है:मोंगोडीबी/पायमोंगो: मानचित्र फ़ंक्शन में डॉट नोटेशन का उपयोग कैसे करें?

db.NY.count({'a.res.z' : '14120'}) 

लेकिन जब मैं नक्शा समारोह की कोशिश (अजगर में, क्योंकि मैं PyMongo उपयोग कर रहा हूँ):

map = Code("function() {" 
      " emit(this.a.res.z, 1);" 
      "}") 

जब मैं mapreduce फोन मैं इस त्रुटि मिलती है:

pymongo.errors.OperationFailure: db assertion failure, assertion: 'map invoke failed: JS Error: TypeError: this.a has no properties nofile_b:0', assertionCode: 9014 

डॉट नोटेशन शीर्ष स्तर पर काम करता है - उदाहरण के लिए एक बिंदु - लेकिन मैं इसे एम्बेड करने पर काम नहीं कर सकता। क्या राज हे?

उत्तर

9

यह त्रुटि का अर्थ है कि कम से कम एक ऑब्जेक्ट जो आप मानचित्र-न्यूनीकरण कर रहे हैं resa का क्षेत्र गुम है। देखें:

> db.NY.find({}, {_id: 0})            
{ "a" : { "res" : { "z" : 10011 } }, "name" : "alice" } 
{ "a" : { "res" : { "z" : 10011 } }, "name" : "bob" } 
{ "a" : { "res" : { "z" : 10012 } }, "name" : "carol" } 
> m                  
function() { 
    emit(this.a.res.z, 1); 
} 
> r                  
function (key, values) { 
    var v = 0; 
    values.forEach(function (obj) {v += obj;}); 
    return v; 
} 
> db.runCommand({mapreduce: "NY", map: m, reduce: r, out: {inline: 1}}) 
{ 
    "results" : [ 
     { 
      "_id" : 10011, 
      "value" : 2 
     }, 
     { 
      "_id" : 10012, 
      "value" : 1 
     } 
    ], 
    "timeMillis" : 0, 
    "counts" : { 
     "input" : 3, 
     "emit" : 3, 
     "output" : 2 
    }, 
    "ok" : 1 
} 
> db.NY.insert({a: {}, name: "empty"})              
> db.runCommand({mapreduce: "NY", map: m, reduce: r, out: {inline: 1}}) 
{ 
    "assertion" : "map invoke failed: JS Error: TypeError: this.a.res has no properties nofile_b:1", 
    "assertionCode" : 9014, 
    "errmsg" : "db assertion failure", 
    "ok" : 0 
} 

आप एक query तर्क का उपयोग नक्शा-कम करने के लिए कर सकते हैं केवल उन्हीं क्षेत्रों है कि आप चाहते हैं कि पर संचालित करने के लिए:

> db.runCommand({mapreduce: "NY", map: m, reduce: r, out: {inline: 1}, 
       query: {"a.res.z": {$exists: true}}}) 
{ 
    "results" : [ 
     { 
      "_id" : 10011, 
      "value" : 2 
     }, 
     { 
      "_id" : 10012, 
      "value" : 1 
     } 
    ], 
    "timeMillis" : 1, 
    "counts" : { 
     "input" : 3, 
     "emit" : 3, 
     "output" : 2 
    }, 
    "ok" : 1 
} 

PyMongo से query तर्क का उपयोग करने के लिए, आप सेट कर सकते यह एक कीवर्ड तर्क के रूप में map_reduce(...)

+0

उत्कृष्ट, धन्यवाद! – Dan