MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Използване на map/reduce за картографиране на свойствата в колекция

Добре, това е малко по-сложно, защото ще трябва да използвате известна рекурсия.

За да се случи рекурсията, ще трябва да можете да съхранявате някои функции на сървъра.

Стъпка 1:дефинирайте някои функции и ги поставете от страна на сървъра

isArray = function (v) {
  return v && typeof v === 'object' && typeof v.length === 'number' && !(v.propertyIsEnumerable('length'));
}

m_sub = function(base, value){
  for(var key in value) {
    emit(base + "." + key, null);
    if( isArray(value[key]) || typeof value[key] == 'object'){
      m_sub(base + "." + key, value[key]);
    }
  }
}

db.system.js.save( { _id : "isArray", value : isArray } );
db.system.js.save( { _id : "m_sub", value : m_sub } );

Стъпка 2:дефинирайте картата и функциите за намаляване

map = function(){
  for(var key in this) {
    emit(key, null);
    if( isArray(this[key]) || typeof this[key] == 'object'){
      m_sub(key, this[key]);
    }
  }
}

reduce = function(key, stuff){ return null; }

Стъпка 3:стартирайте намаляването на картата и вижте резултатите

mr = db.runCommand({"mapreduce" : "things", "map" : map, "reduce" : reduce,"out": "things" + "_keys"});
db[mr.result].distinct("_id");

Резултатите, които ще получите са:

["_id", "_id.isObjectId", "_id.str", "_id.tojson", "egg", "egg.0", "foo", "foo.bar", "foo.bar.baaaar", "hello", "type", "type.0", "type.1"]

Тук има един очевиден проблем, тук добавяме някои неочаквани полета:1. _id данните2. .0 (на яйце и тип)

Стъпка 4:Някои възможни корекции

Запроблем №1 поправката е сравнително лесна. Просто променете map функция. Променете това:

emit(base + "." + key, null); if( isArray...

към това:

if(key != "_id") { emit(base + "." + key, null); if( isArray... }

Проблем №2 е малко по-застрашен. Искахте всички ключове и технически "яйце.0" е валиден ключ. Можете да промените m_sub да игнорирате такива цифрови клавиши. Но също така е лесно да се види ситуация, в която това има обратен ефект. Да кажем, че имате асоциативен масив вътре в обикновен масив, тогава искате да се появи този "0". Останалата част от това решение ще оставя на вас.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да намерите дължината на масива mongodb

  2. mongodb:намиране на най-високата числова стойност на колона

  3. Какво да знаете, когато започнете да работите с MongoDB в производството - десет съвета

  4. Как да проектираме високодостъпни среди за бази данни с отворен код

  5. MongoDB diacriticInSensitive търсене не показва всички редове с ударение (думи с диакритичен знак), както се очаква и обратно