2011-09-18 8 views
5

Quiero ejecutar esta instrucción SQL en MongoDB:Seleccionar distinta más de un campo en el mapa de MongoDB reducir

SELECT DISTINCT book,author from library 

Hasta ahora MongoDB de DISTINCT sólo admite un campo a la vez. Para más de un campo, tenemos que usar el comando GROUP o map-reduce.

He buscado en Google una manera de utilizar el comando GRUPO:

db.library.group({ 
    key: {book:1, author:1}, 
    reduce: function(obj, prev) { if (!obj.hasOwnProperty("key")) { 
     prev.book = obj.book; 
     prev.author = obj.author; 
    }}, 
    initial: { } 
}); 

Sin embargo, este enfoque sólo es compatible con hasta 10.000 llaves. ¿Alguien sabe cómo usar map reduce para resolver este problema?

Respuesta

4

Eche un vistazo a este article que explica cómo encontrar artículos únicos usando map-reduce en MongoDB.

Su declaración emiten va a ser algo como:

emit({book: this.book, author: this.author}, {exists: 1}); 

y su reducir puede ser aún más simple que el ejemplo ya que no se preocupan por la cantidad que hay para cada agrupación.

return {exists: 1}; 
+0

muchas gracias. funciona bien. pero todavía tengo dificultades para encontrar la función de '{exists: 1}'. en mi entender, es una especie de identificador para cada valor único. pero todavía lo encuentro extraño. –

+1

Normalmente, el valor es más complejo y tiene varios campos. Puede simplificar esto para simplemente emitir un valor 1 pero '{exists: 1}' es más fácil de entender y lo hará más fácil cuando quiera agregarle más campos más adelante. –

3

En caso de que alguien se enfrenta al problema similar. Esta es la solución completa:

paso Mapa

map= "function(){ 
    emit(
      {book: this.book, author:this.author}, {exists: 1} 
     ); 
    }" 

Reducir paso

reduce= "function(key, value){ 
      return {exists: 1}; 
    }" 

Ejecutar el comando

result= db.runCommand({ 
     "mapreduce": "library", 
     "map": map, 
     "reduce": reduce, 
     "out: "result" 
    }) 

obtener el resultado

db.result.find() 
Cuestiones relacionadas