MongoDB中的查询

我试图使用rmongodb从MongoDB数据库中获取信息以便在R中进一步处理。但是,我真的很难开始真正开始。 这一个作品:

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))但这并没有奏效。 用%代替=也不起作用。

另一个问题是数据库内容是嵌套的,这意味着我有子树,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))

运行后没有错误消息,但我得到一个空的数据框。 这段代码有什么问题?


现在,如果我想要找到名字是“John”或“Bob”或“Catherine”的人,该怎么办?

您可以使用$in操作符来实现以下功能:

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

值得一读MongoDB高级查询页面以及点符号(达到对象)。

另一个问题是数据库内容是嵌套的,这意味着我有子树,subsubtrees等

数据结构听起来很难操纵; 将需要一个实际的文档示例来试图说明查询。

那么,如果我想找到所有名字为“约翰”的人,他们都是40岁,并且在2010年失业? 查询会是什么样子?

对数据结构做一些假设,下面是一个简单的“和”查询的例子:

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

这不是一个真正的答案,因为我仍然在自己的某些方面挣扎,但这可能有助于您开始:使用rmongodb在R中运行高级MongoDB查询

另外,请查看随rmongodb页面一起提供的示例应用程序。 也就是说,可以通过github包访问:https://github.com/gerald-lindsly/rmongodb/blob/master/rmongodb/demo/teachers_aid.R

链接地址: http://www.djcxy.com/p/11083.html

上一篇: Queries in MongoDB

下一篇: loop to something more R