2012-08-17 26 views
7

Estoy tratando de usar rmongodb para obtener información de una base de datos MongoDB para su posterior procesamiento en R. Sin embargo, tengo algunas dificultades para realmente comenzar. Esta funciona:Consultas en MongoDB

cursor <- mongo.find(mongo, "people", query=list(last.name="Smith", first.name="John"), 
       fields=list(address=1L, age=1L)) 
while (mongo.cursor.next(cursor)){ 
    print(mongo.cursor.value(cursor))} 

Ahora, lo que si quiero encontrar personas cuyo primer nombre es "Juan" o "Bob" o "Catherine"? Intenté query=list(last.name="Smith", first.name=c(John, Bob, Catherine)) pero esto no funcionó. Reemplazar = con % tampoco funcionó.

Otra cuestión es que el contenido de la base de datos está anidado, que significa que tengo subárboles, subsubtrees etc. Por ejemplo, para la entrada first.name="John", last.name="Smith" I podrían tener subentradas como address, age, occupation, y para la ocupación de nuevo I podría tener categorías como subárboles (por ejemplo, años de 2005 a 2012 y para cada año tendría una entrada como "desempleado", "empleado", "emprendedor"). Entonces, ¿qué pasa si quiero encontrar a todas las personas con el primer nombre "John" que tienen 40 años y que estaban desempleados en 2010? ¿Cómo se vería la consulta?

EDITAR en respuesta a Stennie: Aquí hay un ejemplo de la estructura de mi base de datos y la consulta que estoy tratando de hacer. Imagine que los egresados ​​de una universidad se han subdividido en grupos (por ejemplo, "muy buenos estudiantes", "buenos estudiantes", etc.). Cada grupo contiene una lista de personas que han sido asignadas a este grupo junto con sus detalles.

(0){..} 
    _id : (Object ID) class id 
    groupname: (string) unique name for this group (e.g. "beststudents") 
    members[11] 
     (0){..} 
      persid : (integer) 1 
      firstname: (string) 
      surname: (string) 
      age: (integer) 
      occupation: (string) 
     (1){..} 
      persid : (integer) 2 
      firstname: (string) 
      surname: (string) 
      age: (integer) 
      occupation: (string) 
#  and so on until (10){..} 
(1){..} 
    _id : (Object ID) class id 
    groupname: (string) unique name for this group 
    members[3] 
     (0){..} 
      persid : (integer) 1 
      firstname: (string) 
      surname: (string) 
      age: (integer) 
      occupation: (string) 
#  and so on until (2){..} 
# and many more 

Ahora vamos a suponer que yo estoy interesado en los grupos con los nombres de "mejores alumnos" y "buenos estudiantes", y me gustaría tener "apellido" y "ocupación" para cada miembro de cada uno de estos grupos como un objeto R para hacer algunas tramas, estadísticas o lo que sea. Y tal vez también me gustaría refinar esta solicitud para obtener solo aquellos miembros que son menores de 40 años. Ahora, después de haber leído la respuesta de Stennie, he intentado de esta manera:

cursor <- mongo.find(mongo, "test.people", 
      list(groupname=list('$in'=c("beststudents", "goodstudents")), 
       members.age=list('$lt'=40) # I haven't tried this with my DB, so I hope this line is right 
       ), 
      fields=list(members.surname=1L, members.occupation=1L) 
     ) 
count <- mongo.count(mongo, "test.people", 
      list(groupname=list('$in'=c("beststudents", "goodstudents")), 
       members.age=list('$lt'=40) 
       ) 
     ) 
surnames <- vector("character", count) 
occupations <- vector("character", count) 
i <- 1 
while (mongo.cursor.next(cursor)) { 
    b <- mongo.cursor.value(cursor) 
    surnames[i] <- mongo.bson.value(b, "members.surname") 
    occupations[i] <- mongo.bson.value(b, "members.occupation") 
    i <- i + 1 
} 
df <- as.data.frame(list(surnames=surnames, occupations=occupations)) 

No hay mensaje de error después de realizar esto, pero me sale un cuadro de datos vacío. ¿Qué pasa con este código?

+0

Se puede publicar un documento de ejemplo? Idealmente, un ejemplo reducido que muestra el anidamiento típico de su consulta. – Stennie

Respuesta

3

Ahora, lo que si quiero encontrar personas cuyo primer nombre es "Juan" o "Bob" o "Catherine"?

Usted puede utilizar el $in operator para esto:

cursor <- mongo.find(mongo, "test.people", 
    list(last.name="Smith", 
     first.name=list('$in'=c('John','Bob','Catherine')) 
    ) 
) 

Sería vale la pena tener una lectura de la página MongoDB Advanced Queries, así como Dot Notation (Reaching Into Objects).

Otra cuestión es que el contenido de la base de datos está anidado, lo que significa tengo subárboles, subsubtrees etc.

La estructura de datos sonidos potencialmente desafiando a manipular; necesitaría un ejemplo práctico de un documento para tratar de ilustrar la consulta.

¿Y si quiero encontrar a todas las personas con nombre "John" que tienen 40 años de edad y estaban desempleados en 2010? ¿Cómo se vería la consulta?

hacer algunas suposiciones sobre la estructura de datos, aquí está un ejemplo de un simple "y" consulta:

cursor <- mongo.find(mongo, "test.people", 
    list(
     first.name='John', 
     fy2012.job='unemployed', 
     age = 40 
    ) 
) 
+0

Gracias por su respuesta, es útil. Inserté un ejemplo más detallado con un código que probé después de haber leído su respuesta, pero no funcionó como debería. ¿Tienes una idea sobre cuál es el problema? – AnjaM

+0

@AnjaM: Disculpas, perdiste tu último comentario aquí, que también agrega un nuevo ejemplo en la descripción. ¿Pudiste solucionar el problema con esa consulta? De lo contrario, probablemente sea mejor agregar como una pregunta separada. – Stennie

Cuestiones relacionadas