7

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

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

4

2 に答える 2

3

さて、名が「ジョン」、「ボブ」、「キャサリン」のいずれかである人を見つけたい場合はどうすればよいですか?

これには$in演算子を使用できます。

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

MongoDB Advanced QueriesページとDotNotation(Reaching Into Objects)を読む価値があります。

もう1つの問題は、データベースコンテンツがネストされていることです。つまり、サブツリー、サブサブツリーなどがあります。

データ構造は、操作が難しい可能性があります。クエリを説明するために、ドキュメントの実際的な例が必要になります。

では、40歳で、2010年に失業した「ジョン」という名の人をすべて見つけたい場合はどうすればよいでしょうか。クエリはどのようになりますか?

データ構造についていくつかの仮定を立てて、単純な「and」クエリの例を次に示します。

cursor <- mongo.find(mongo, "test.people",
    list(
        first.name='John',
        fy2012.job='unemployed',
        age = 40
    )
)
于 2012-08-22T13:32:27.397 に答える
0

私はまだいくつかの側面に苦労しているので、それは実際には答えではありませんが、これはあなたが始めるのに役立つかもしれません: rmongodbを使用してRで高度なMongoDBクエリを実行する

また、rmongodbページに付属しているサンプルアプリケーションも確認してください。つまり、githubパッケージからアクセスできます: https ://github.com/gerald-lindsly/rmongodb/blob/master/rmongodb/demo/teachers_aid.R

于 2012-08-17T12:18:05.697 に答える