2011-02-12 42 views
18

estoy empezando con mongodb y tienen una colección con los documentos que se parecen a la siguienteObtener una lista de todas las etiquetas únicas en mongodb

{ 
    "type": 1, 
    "tags": ["tag1", "tag2", "tag3"] 
} 
{ 
    "type": 2, 
    "tags": ["tag2", "tag3"] 
} 
{ 
    "type": 3, 
    "tags": ["tag1", "tag3"] 
} 
{ 
    "type": 1, 
    "tags": ["tag1", "tag4"] 
} 

Con esto, quiero un conjunto de todas las etiquetas de una genero particular. Por ejemplo, para el tipo 1, quiero el conjunto de tag1, tag2, tag3, tag4 (cualquier orden).

Todo lo que podía pensar es conseguir las etiquetas y agregarlas a un set en python, pero quería saber si hay una manera de hacerlo con mapreduce de mongodb o algo más. Por favor avise.

Respuesta

41

Si solo quiere una lista (distinta) de las etiquetas, entonces usar distintas será mejor. Map/Reduce será más lento y no puede usar un índice para la parte de javascript.

http://docs.mongodb.org/manual/reference/method/db.collection.distinct/

db.coll.distinct("tags", {type:1}) devolverá un conjunto de etiquetas para type = 1.

+0

hombre impresionante! hiciste mi día :) Muchas gracias –

3

Tiene razón, un Mapa/Reducir podría funcionar para lo que está tratando de lograr, pero un Conjunto podría ser más rápido y menos código.

> m =  function() { 
...   for (var tag in this.tags) { 
...    emit(this.tags[tag], 1); 
...   } 
...  } 

> r =  function(key, values) { 
...   return 1; 
...  } 

> db.tags.mapReduce(m, r).find() 
{ "_id" : "tag1", "value" : 1 } 
{ "_id" : "tag2", "value" : 1 } 
{ "_id" : "tag3", "value" : 1 } 
+0

después de hacer esto, todavía tendré que usar el método 'set' para obtener la lista de etiquetas de una manera que necesito, entonces ¿por qué incluso usar un paso map-reduce? ¿Por qué no simplemente hacer un '.find ({}, {tags: 1})' y operar en ellos ... –

+0

¿Cómo se necesitan las etiquetas devueltas? Usted no especificó eso en su pregunta. –

+0

Vaya, pensé que estaba claro, supongo que no ... Los quiero en una lista o en un conjunto (cualquiera iterable básicamente), de las etiquetas, sin repeticiones, es decir, valores distintos solamente –

Cuestiones relacionadas