2011-09-26 20 views
7

La base de datos está cerca de 5GB. Tengo documentos como:Mongo DB: cómo seleccionar elementos con el número de matrices anidadas> 0

{ 
    _id: .. 
    user: "a" 
    hobbies: [{ 
     _id: .. 
     name: football 
    }, 
    { 
     _id: .. 
     name: beer 
    } 
    ... 
    ] 
} 

quiero devolver los usuarios que tienen más de 0 "hobbies" He intentado

db.collection.find({"hobbies" : { &gt : 0}}).limit(10) 

y se tarda toda la memoria RAM y ningún resultado.

  1. Cómo realizar esta selección?
  2. Y cómo devolver solo: id, name, count?
  3. ¿Cómo hacerlo con el controlador oficial C#?

TIA

P. S. near He encontrado: "Agregue un nuevo campo al tamaño de la categoría Hande. Es una práctica habitual en mongo world". es esto cierto?

Respuesta

8

Ha intentado usar hobbies.length. No he probado esto, pero creo que este es el camino correcto para consultar el rango de la matriz en mongodb

db.collection.find({$where: '(this.hobbies.length > 0)'}) 
+0

esto funciona - pero en pequeña cantidad de datos. Para mi tarea, parece que debería mantener la variable "contar". – 1gn1ter

1

Earlier questions explican cómo manejar el problema de conteo de arreglos. Aunque en su caso si ZERO es realmente el único valor que desea probar, puede establecer el conjunto como nulo cuando está vacío y establecer la opción para no serializarlo, luego puede probar la existencia de ese campo. Recuerde probar null y crear la matriz cuando desee agregar un hobby a un usuario.

Para el n. ° 2, siempre que haya agregado el campo de conteo, es fácil seleccionar los campos que desea de la base de datos e incluir el campo de recuento.

2

Eso es cierto.

Según el manual

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

$ tamaño

El $ operador tamaño coincide con cualquier matriz con el número especificado de elementos. En el siguiente ejemplo se correspondería con el objeto {a: [ "foo"]}, desde esa matriz tiene un solo elemento:

db.things.find({ a : { $size: 1 } }); 

No se puede utilizar $ tamaño para encontrar una gama de tamaños (por ejemplo: matrices con más de 1 elemento). Si necesita una consulta de un rango, crear un campo de tamaño extra de que se incrementan cuando se agregan elementos

para que pueda comprobar por tamaño de la matriz 0, pero no para cosas como 'mayor que 0'

0
  1. si necesita encontrar solo cero pasatiempos, y si la clave de pasatiempos no está configurada para alguien con cero pasatiempos, use la bandera EXISTS. Agregue un índice de "pasatiempos" para la mejora del rendimiento:

    db.collection.find ({hobbies: {$ exists: true}});

  2. Sin embargo, si la persona con cero aficiones tiene matriz vacía, y la persona con 1 manía tiene una matriz con 1 elemento, a continuación, utilizar esta solución genérica:

Mantener una variable llamada "hcount" (recuento de pasatiempos), y siempre configúrelo igual al tamaño de la matriz de pasatiempos en cualquier actualización. índice en el campo "hcount" A continuación, se puede hacer una consulta como:

db.collection.find({ hcount : 0 }) // people with 0 hobbies  
db.collection.find({ hcount : 5 }) // people with 5 hobbies 

3 - De @JohnPs responden: "tamaño $" es también un buen operador para este uso. http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

16

En este caso específico, puede utilizar la lista de indexación para resolver su problema:

db.collection.find({"hobbies.0" : {$exists : true}}).limit(10)

Esto solo asegura que existe un 0º elemento. Puede hacer lo mismo para asegurarse de que la lista sea más corta que n o entre xey en longitud al verificar los elementos existentes al final del rango.

7

Puede (tipo de) comprobar si hay una gama de longitudes de serie con el operador $size utilizando una lógica $not:

db.collection.find({array: {$not: {$size: 0}}}) 
+0

Parece ser la respuesta más aplicable a una matriz que tiene un tamaño distinto de cero. – Roddy