Abfragen in MongoDB

Ich versuche es zu benutzenrmongodb Informationen aus einer MongoDB-Datenbank zur weiteren Verarbeitung in R abzurufen. Allerdings habe ich einige Schwierigkeiten, um wirklich loszulegen. Dieser funktioniert:

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))}

Was ist, wenn ich Personen suchen möchte, deren Vorname entweder "John" oder "Bob" oder "Catherine" ist? Ich habe es versuchtquery=list(last.name="Smith", first.name=c(John, Bob, Catherine)) aber das hat nicht geklappt. Ersetzen= mit% hat auch nicht funktioniert.

Ein weiteres Problem ist, dass der Datenbankinhalt verschachtelt ist, was bedeutet, dass ich Teilbäume, Teilbäume usw. für den Eintrag habefirst.name="John", last.name="Smith" Ich könnte Untereinträge wie habenaddress, age, occupationund für den Beruf könnte ich wieder Kategorien als Teilbäume haben (z. B. Jahre von 2005 bis 2012 und für jedes Jahr hätte ich einen Eintrag wie "arbeitslos", "Angestellter", "Unternehmer"). Was ist, wenn ich alle Personen mit dem Vornamen "John" finden möchte, die 40 Jahre alt und 2010 arbeitslos waren? Wie würde die Abfrage aussehen?

BEARBEITEN als Antwort auf Stennie: Hier ist ein Beispiel für die Struktur meiner Datenbank und die Abfrage, die ich ausführen möchte. Stellen Sie sich vor, dass die Absolventen einer Universität in Gruppen unterteilt wurden (z. B. "sehr gute Studenten", "gute Studenten" usw.). Jede Gruppe enthält dann eine Liste der Personen, die dieser Gruppe zugeordnet wurden, sowie deren Details.

(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

Nehmen wir nun an, ich interessiere mich für die Gruppen mit den Namen "Beste Schüler" und "Gute Schüler" und möchte für jedes Mitglied jeder dieser Gruppen "Nachname" und "Beruf" als R-Objekt erhalten, um Mach ein paar Pläne, Statistiken oder was auch immer. Und vielleicht möchte ich diese Anfrage auch verfeinern, um nur die Mitglieder zu gewinnen, die jünger als 40 Jahre sind. Nachdem ich Stennies Antwort gelesen hatte, versuchte ich es folgendermaßen:

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))

Es wird keine Fehlermeldung angezeigt, aber ich erhalte einen leeren Datenrahmen. Was ist los mit diesem Code?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage