Rでさらに処理するためにMongoDBデータベースから情報をフェッチするために使用しようとしていrmongodb
ます。しかし、実際に開始するにはいくつかの問題があります。これは機能します:
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))}
さて、名が「ジョン」、「ボブ」、「キャサリン」のいずれかである人を見つけたい場合はどうすればよいですか?試しましたが、うまくいきquery=list(last.name="Smith", first.name=c(John, Bob, Catherine))
ませんでした。との置き換えも機能=
し%
ませんでした。
もう1つの問題は、データベースコンテンツがネストされていることです。つまり、サブツリー、サブサブツリーなどがあります。たとえば、エントリの場合は、のfirst.name="John", last.name="Smith"
ようなサブエントリがaddress, age, occupation
あり、職業の場合は、サブツリーとしてカテゴリがあります(たとえば、2005年から2012年までの年など)。毎年、「失業者」、「店員」、「起業家」などのエントリがあります。では、40歳で、2010年に失業した「ジョン」という名の人をすべて見つけたい場合はどうすればよいでしょうか。クエリはどのようになりますか?
Stennieへの返信として編集:これが私のデータベースの構造と私が行おうとしているクエリの例です。大学の卒業生がグループに細分化されていると想像してみてください(たとえば、「非常に優秀な学生」、「優秀な学生」など)。各グループには、このグループに割り当てられている人々のリストとその詳細が含まれています。
(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
ここで、「最高の学生」と「良い学生」という名前のグループに興味があり、これらの各グループの各メンバーの「名前」と「職業」をRオブジェクトとして取得したいとします。いくつかのプロット、統計などを行います。また、このリクエストを改良して、40歳未満のメンバーのみを取得したいと思うかもしれません。Stennieの返信を読んだ後、次のように試しました。
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))
これを実行した後、エラーメッセージは表示されませんが、空のデータフレームが表示されます。このコードの何が問題になっていますか?