Consultas en MongoDB

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

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, ¿qué pasa si quiero encontrar personas cuyo nombre de pila sea "John" o "Bob" o "Catherine"? Lo intentéquery=list(last.name="Smith", first.name=c(John, Bob, Catherine)) pero esto no funcionó. Reemplazo= con% Tampoco funcionó.

Otro problema es que el contenido de la base de datos está anidado, lo que significa que tengo subárboles, subárboles, etc. Por ejemplo, para la entradafirst.name="John", last.name="Smith" Podría tener subentradas comoaddress, age, occupation, y para la ocupación nuevamente podría tener categorías como subárboles (por ejemplo, de 2005 a 2012 y por cada año tendría una entrada como "desempleado", "empleado", "empresario"). Entonces, ¿qué sucede si quiero encontrar a todas las personas con el nombre "John" que tienen 40 años y estaban desempleadas en 2010? ¿Cómo sería la consulta?

EDITAR como respuesta a Stennie: Este es un ejemplo de la estructura de mi base de datos y la consulta que estoy tratando de hacer. Imagine que los alumnos de una universidad se han subdividido en grupos (por ejemplo, "muy buenos estudiantes", "buenos estudiantes", etc.). Cada grupo luego 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 supongamos que estoy interesado en los grupos con los nombres "mejores estudiantes" y "buenos estudiantes", y me gustaría obtener "apellido" y "ocupación" para cada miembro de cada uno de estos grupos como un objeto R para poder hacer algunas parcelas, estadísticas o lo que sea. Y tal vez también quisiera refinar esta solicitud para obtener solo a los miembros que tienen menos de 40 años. Ahora, después de haber leído la respuesta de Stennie, lo intenté 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 ningún mensaje de error después de ejecutar esto, pero obtengo un marco de datos vacío. ¿Qué hay de malo con este código?

Respuestas a la pregunta(2)

Su respuesta a la pregunta