rmongodb
を使用して、Rでのさらなる処理のためにMongoDBデータベースから情報を取得しようとしています。しかし、実際に始めるにはいくつかの困難があります。これは動作します: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))}
「John」または「Bob」または「Catherine」のいずれかの名前を持つ人を探したい場合はどうすればよいですか。私はquery=list(last.name="Smith", first.name=c(John, Bob, Catherine))
を試しましたが、これはうまくいかなかったのです。 =
を%
に置き換えても機能しませんでした。
もう1つの問題は、サブツリー、サブサブツリーなどがあることを意味します。つまり、first.name="John", last.name="Smith"
の場合、address, age, occupation
のようなサブエントリーがあります。職業については、サブツリー2005年から2012年まで、そして毎年私は "失業者"、 "事務員"、 "起業家"のようなエントリを持っています)。だから、2010年に失業した40歳の名前の "John"という人たちを探したいのですが?クエリはどのように見えますか?
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))
これを実行した後にエラーメッセージがありませんが、私は空のデータフレームを取得します。このコードで何が問題になっていますか?
あなたは例のドキュメントを投稿することができますか?理想的には、クエリの典型的なネスティングを示す縮小例です。 – Stennie