Tengo un montón de puestos de la categoría de etiquetas en ellos.
Estoy tratando de averiguar cuántas veces cada categoría ha sido utilizada.

Estoy usando rails con mongodb, PERO no creo que me necesita conseguir la ocurrencia de las categorías de la db, por lo que el mongo parte no importa.

Esto es lo que tengo hasta ahora

@recent_posts = current_user.recent_posts #devuelve el 10 publicaciones más recientes 
@categories_hash = {'tech' => 0, 'mundo' => 0, 'entretenimiento' => 0, 'deportes' => 0} 
@recent_posts hacer |gato| 
cat.categorías.hacer cada uno |addCat| 
@categories_hash.incremento(addCat) #obviamente, esto es donde estoy teniendo problemas 
final 
final 
final 

la estructura del post es

{"_id" : ObjectId("idnumber"), "created_at" : "Tue Aug 03...", "categorías" :["mundo", "deporte"], "mensaje" : "el texto de la entrada", "poster_id" : ObjectId("idOfUserPoster"), "electores" : []}

Estoy abierto a sugerencias sobre cómo obtener el número de categorías, pero yo se desea obtener el número de votantes finalmente, por lo que a mí me parece la mejor manera de incrementar la categories_hash y, a continuación, agregar los votantes.de longitud, pero una cosa a la vez, sólo estoy tratando de averiguar cómo los valores de incremento en el valor hash.

InformationsquelleAutor pedalpete | 2010-08-05

2 Comentarios

  1. 8

    Si usted no está familiarizado con map/reduce y no se preocupan por la ampliación, esto no es tan elegante como map/reduce, pero debe ser suficiente para sitios pequeños:

    @categories_hash = Hash.new(0)
    current_user.recent_posts.each do |post|
      post.categories.each do |category|
        @categories_hash[category] += 1
      end
    end
    • También se puede quitar el @categories_hash[category] ||= 0 si cambia la primera línea para @categories_hash = Hash.new(0) o inicializarlo, como lo era en la pregunta original.
    • Tienes razón, gracias. Yo siempre olvidan hash valores por defecto. La edición de…
  2. 1

    Si usted está usando mongodb, una forma elegante de agregar etiqueta de uso sería, para usar un map/reduce operación. Mongodb soporta map/reduce las operaciones mediante el código JavaScript. Map/reduce ejecuta en el servidor de db(s), es decir, su aplicación no tiene para recuperar y analizar cada documento (que no escala bien para grandes colecciones).

    Como ejemplo, aquí están las funciones map y reduce voy a usar en mi blog sobre los artículos de la colección para agregar el uso de etiquetas (que se usa para generar la nube de etiquetas en la barra lateral). Los documentos en los artículos de la colección de tener una clave denominada ‘etiquetas’, que contiene una matriz de cadenas (las etiquetas)

    La función del mapa simplemente emite 1 en cada etiqueta usada a tener en cuenta:

    function () {
      if (this.tags) {
        this.tags.forEach(function (tag) {
          emit(tag, 1);
        });
      }
    }

    La reducción de la función resume la cuenta:

    function (key, values) {
      var total = 0;
      values.forEach(function (v) {
        total += v;
      });
      return total;
    }

    Como resultado, la base de datos devuelve un hash que tiene una clave para cada etiqueta y su recuento de uso como un valor. E. g.:

    { 'rails' => 5, 'ruby' => 12, 'linux' => 3 }
    • Bueno, he estado tentado de aprender y de usar map/reduce de todos modos, pensé que su podría haber sido una manera más fácil de hacer esto con ruby, pero voy a darle a su manera un tiro y el informe de nuevo.
    • Seguro que es más fácil de hacer en Ruby, pero también la menos eficiente, a pesar de que todavía podría ser suficiente para sitios pequeños. He publicado otra respuesta, con una variación de su código original.

Dejar respuesta

Please enter your comment!
Please enter your name here