2012-08-17 13 views
7

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

これを実行した後にエラーメッセージがありませんが、私は空のデータフレームを取得します。このコードで何が問題になっていますか?

+0

あなたは例のドキュメントを投稿することができますか?理想的には、クエリの典型的なネスティングを示す縮小例です。 – Stennie

答えて

3

、私はその最初の名前「ジョン」 または「ボブ」や「キャサリン」のいずれかである人を見つけたい場合は何?

あなたはこのために$in operatorを使用することができます。

cursor <- mongo.find(mongo, "test.people", 
    list(last.name="Smith", 
     first.name=list('$in'=c('John','Bob','Catherine')) 
    ) 
) 

それはMongoDBのAdvanced Queriesページの読み込みだけでなく、Dot Notation (Reaching Into Objects)を持つ価値があるだろう。

もう一つの問題は、データベースの内容を意味し、ネストされていることである 私が持っているサブツリーなどsubsubtrees

データ構造潜在的に操作するために、挑戦聞こえます。クエリを説明しようとする文書の実用的な例が必要です。私は は40歳で、2010年に失業した最初の名前「ジョン」で、すべての人を見つけたい場合はどのようなので

?クエリはどのように見えますか?データ構造に関するいくつかの仮定を作る

、ここでは単純な「と」クエリの例です:

cursor <- mongo.find(mongo, "test.people", 
    list(
     first.name='John', 
     fy2012.job='unemployed', 
     age = 40 
    ) 
) 
+0

返信いただきありがとうございます。私はあなたの返信を読んだ後に試したコードでより詳細な例を挿入しましたが、それはうまくいきませんでした。あなたは何が問題なのか考えていますか? – AnjaM

+0

@AnjaM:お詫び申し上げます、ここにあなたの最後のコメントがありません。あなたはその質問で問題を分類することができましたか?そうでない場合は、別の質問として追加する方がよいでしょう。 – Stennie

0

私はまだいくつかの側面で自分自身を苦労してるようそれは本当に答えではないのですが、これはあなたが始めるのに役立つかもしれない: Running advanced MongoDB queries in R with rmongodb

また、そのrmongodbページに付属のサンプルアプリケーションを確認してください。それはgithubのパッケージでアクセスしている、次のとおりです。今 https://github.com/gerald-lindsly/rmongodb/blob/master/rmongodb/demo/teachers_aid.R