2012-08-17 122 views
7

我試圖使用rmongodb從MongoDB數據庫中獲取信息以便在R中進一步處理。但是,我真的很難開始。這其中的工作原理: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))} 

現在,如果我想找到人,他們的第一個名稱是「約翰」或「鮑勃」或「凱瑟琳」?我試過query=list(last.name="Smith", first.name=c(John, Bob, Catherine)),但這並沒有解決。用%代替=也沒有工作。

另一個問題是,數據庫內容嵌套,這意味着我有子樹,subsubtrees等。例如,對於入門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)) 

有運行此之後沒有錯誤消息,但我得到一個空的數據幀。這段代碼有什麼問題?

+0

您可以發佈一個例子文件?理想情況下是一個簡化的例子,它顯示了查詢的典型嵌套。 – Stennie 2012-08-22 13:09:02

回答

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等

的數據結構的聲音可能具有挑戰性的操作;將需要一個實際的文檔示例來試圖說明查詢。

那麼,如果我想找到所有名字爲「John」的人,他們是誰,他們的年齡是40歲,2010年失業了嗎?查詢會是什麼樣子?

使一些假設的數據結構,這裏是一個簡單的「和」查詢的一個例子:

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

感謝您的回覆,這很有幫助。我插入了一個更詳細的示例,其中包含了我在閱讀完回覆後試用過的代碼,但這並不符合它的要求。你有什麼問題的想法嗎? – AnjaM 2012-08-28 15:20:02

+0

@AnjaM:道歉,錯過了你在這裏的最後一條評論,這也在說明中增加了一個新例子。您是否能夠利用該查詢來理清問題?如果沒有,最好添加一個單獨的問題。 – Stennie 2012-09-13 12:09:18