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?
Se puede publicar un documento de ejemplo? Idealmente, un ejemplo reducido que muestra el anidamiento típico de su consulta. – Stennie