MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Używanie map/reduce do mapowania właściwości w kolekcji

OK, to jest trochę bardziej skomplikowane, ponieważ będziesz musiał użyć rekurencji.

Aby wywołać rekursję, musisz mieć możliwość przechowywania niektórych funkcji na serwerze.

Krok 1:zdefiniuj niektóre funkcje i umieść je po stronie serwera

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 } );

Krok 2:zdefiniuj mapę i zmniejsz funkcje

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; }

Krok 3:uruchom mapę, zmniejsz i spójrz na wyniki

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

Otrzymane wyniki to:

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

Jest tu jeden oczywisty problem, dodajemy tutaj nieoczekiwane pola:1. _id dane2. .0 (na jajku i typie)

Krok 4:Niektóre możliwe poprawki

W przypadku problemu nr 1 naprawa jest stosunkowo łatwa. Po prostu zmodyfikuj map funkcjonować. Zmień to:

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

do tego:

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

Problem nr 2 jest trochę bardziej ryzykowny. Chciałeś wszystkie klucze i technicznie "egg.0" jest ważny klucz. Możesz zmodyfikować m_sub aby zignorować takie klawisze numeryczne. Ale łatwo też zauważyć sytuację, w której to się nie powiedzie. Załóżmy, że masz tablicę asocjacyjną wewnątrz zwykłej tablicy, a następnie chcesz, aby pojawiło się „0”. Resztę rozwiązania pozostawiam tobie.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB nie uruchamia się po awarii serwera

  2. Mongoid:znajdź poprzez tablicę identyfikatorów

  3. MongoDB 2.1 Aggregate Framework Sum of Array Elements pasujących do nazwy

  4. Limit rozmiaru pojedynczego dokumentu MongoDB wynosi 16 MB

  5. MongoDB zagregowane wypełnienie brakujących dni