标签: rmongodb

多次使用位置`$`运算符来更新嵌套数组

这个问题是密切相关的这一个,我会考虑在NoSQL的情况下给出关于架构设计的意见,但我很好奇,想明白这一点:

实际问题

假设您有以下文档:

    _id : 2      abcd
    name : 2     unittest.com
    paths : 4    
        0 : 3    
            path : 2     home
            queries : 4      
                0 : 3    
                    name : 2     query1
                    url : 2      www.unittest.com/home?query1
                    requests: 4

                1 : 3    
                    name : 2     query2
                    url : 2      www.unittest.com/home?query2
                    requests: 4
Run Code Online (Sandbox Code Playgroud)

基本上,我想知道

  1. 如果可以在涉及"嵌套度"大于1的数组/文档结构的更新方案中多次使用MongoDB的位置$运算符(详细信息),或者换句话说不同:

    { <update operator>: { "paths.$.queries.$.requests" : value } }(不起作用)

    而不是"只"能够使用$ 一次顶级数组并绑定为"更高级别"上的数组使用显式索引:

    { <update operator>: { "paths.$.queries.0.requests" : …

r mongodb nosql rmongodb

20
推荐指数
3
解决办法
1万
查看次数

如何从R查询MongoDB?

我想从R获取MongoDB查询

有了mongoshell,我会查询:

db.user.find({age:{$gt:21}})
Run Code Online (Sandbox Code Playgroud)

但是,在R-Mongo中,我还没有找到如何描述这个查询.

谢谢

r mongodb rmongodb rmongo

12
推荐指数
2
解决办法
7493
查看次数

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))}
Run Code Online (Sandbox Code Playgroud)

现在,如果我想找到名字是"John"或"Bob"或"Catherine"的人呢?我试过query=list(last.name="Smith", first.name=c(John, Bob, Catherine))但这没有用.替换也没有=%.

另一个问题是数据库内容是嵌套的,这意味着我有子树,子树等等.例如,对于条目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 …
Run Code Online (Sandbox Code Playgroud)

r mongodb rmongodb

7
推荐指数
1
解决办法
1816
查看次数

使用rmongodb加速大型结果集处理

我正在使用rmongodb来获取特定集合中的每个文档.它可以工作,但我正在使用数百万个小文档,可能是100M或更多.我正在使用网站上作者建议的方法:cnub.org/rmongodb.ashx

count <- mongo.count(mongo, ns, query)
cursor <- mongo.find(mongo, query)
name <- vector("character", count)
age <- vector("numeric", count)
i <- 1
while (mongo.cursor.next(cursor)) {
    b <- mongo.cursor.value(cursor)
    name[i] <- mongo.bson.value(b, "name")
    age[i] <- mongo.bson.value(b, "age")
    i <- i + 1
}
df <- as.data.frame(list(name=name, age=age))
Run Code Online (Sandbox Code Playgroud)

这适用于数百或数千个结果但是循环非常非常慢.有什么方法可以加快速度吗?也许是多处理的机会?任何建议,将不胜感激.我平均每小时1M,按照这个速度,我只需要一周时间来构建数据框.

编辑:我注意到while循环中的矢量越多,它就越慢.我现在正试图为每个向量分别循环.虽然看起来仍然像黑客,但必须有更好的方法.

编辑2:我对data.table运气不错.它仍在运行,但看起来它将在4小时内完成12M(这是我目前的测试设置),这是进步但远非理想

dt <- data.table(uri=rep("NA",count),
                 time=rep(0,count),
                 action=rep("NA",count),
                 bytes=rep(0,count),
                 dur=rep(0,count))

while (mongo.cursor.next(cursor)) {
  b <- mongo.cursor.value(cursor)
  set(dt, i, 1L,  mongo.bson.value(b, "cache"))
  set(dt, i, 2L,  mongo.bson.value(b, "path"))
  set(dt, i, 3L,  mongo.bson.value(b, "time"))
  set(dt, i, 4L,  mongo.bson.value(b, …
Run Code Online (Sandbox Code Playgroud)

r bigdata mongodb dataframe rmongodb

6
推荐指数
1
解决办法
1542
查看次数

使用rmongodb在R中运行高级MongoDB查询

由于MySQL让我疯狂,我试图让自己熟悉我的第一个"NoSQL"DBMS,它恰好是MongoDB.我通过rmongodb连接到它.

我使用rmongodb越多,运行高级查询就会遇到更多问题/问题.

首先介绍一些示例数据,然后再详细介绍我无法正确指定的不同类型的查询.

示例数据

这个例子来自MongoDB网站,并且已经简化了一些.

pkg <- "rmongodb"
if (!require(pkg, character.only=TRUE)) {
    install.packages(pkg)
    require(pkg, character.only=TRUE)   
}

# Connect to DB
db <- "test"
ns <- "posts"
mongo <- mongo.create(db=db)

# Insert document to collection 'test.users'
b <- mongo.bson.from.list(list(
    "_id"="alex", 
    name=list(first="Alex", last="Benisson"),
    karma=1.0,
    age=30,
    test=c("a", "b")
))
mongo.insert(mongo, "test.users", b)

# Insert document to collection 'test.posts'
b <- mongo.bson.from.list(list(
        "_id"="abcd",
        when=mongo.timestamp.create(strptime("2011-09-19 02:00:00",
            "%Y-%m-%d %H:%M:%s"), increment=1),
        author="alex",
        title="Some title",
        text="Some text.",
        tags=c("tag.1", "tag.2"),
        votes=5, …
Run Code Online (Sandbox Code Playgroud)

r mongodb rmongodb

5
推荐指数
1
解决办法
6957
查看次数

使用哪个包连接R与MongoDB?

我想知道连接MongoDB rmongodbRMongo包之间的主要区别是什么R.这两个包的优点和缺点是什么?

r mongodb rmongodb rmongo

5
推荐指数
1
解决办法
7573
查看次数

如何从R批量插入MongoDB中的文档?

我在R中有一个数据框,我试图将数据帧的每一行批量插入MongoDB中的单独文档.我能做的最接近的是使用以下脚本创建一个文档,并将dataframe行作为其子文档.

x <- toJSON(unname(split(score, 1:nrow(score))))
bson <- mongo.bson.from.JSON(x)
mongo.insert(mongo,'abc.abc',x)
Run Code Online (Sandbox Code Playgroud)

另一方面,我希望每行都是单独的文档.我也看到上面的方法非常快,但是如果我们绕着行循环,它会大大降低速度

r mongodb rmongodb rmongo

2
推荐指数
1
解决办法
1244
查看次数

更新MongoDB中的多个文档(rmongodb)

我偶然发现了有关函数处理更新(mongo.update())的一些问题.

放弃

由于我还在熟悉MongoDBrmongodb软件包,所以说明的问题很可能是由于我缺乏知识;-)

准备工作

确保加载包

pkg <- "rmongodb"
lib <- file.path(R.home(), "library")
if (!suppressWarnings(require(pkg, lib.loc=lib, character.only=TRUE))) {
    install.packages(pkg, lib=lib)
    require(pkg, lib.loc=lib, character.only=TRUE)
}
Run Code Online (Sandbox Code Playgroud)

全局变量

db      <- "__test"
ns.0    <- "user"
ns      <- paste(db, ns.0, sep=".")
con     <- mongo.create(db=db)
Run Code Online (Sandbox Code Playgroud)

创建数据库的初始状态

确保emtpy DB

mongo.remove(mongo=con, ns=ns, 
    criteria=mongo.bson.from.list(lst=list(namefirst="John")))
Run Code Online (Sandbox Code Playgroud)

插入文件

fields      <- list(namefirst="John", namelast="Doe")
b           <- mongo.bson.from.list(lst=fields)
mongo.insert(mongo=con, ns=ns, b=b)
if (is.null(mongo.find.one(mong=con, ns=ns, query=b))) {
    stop("Something went wrong")
}
Run Code Online (Sandbox Code Playgroud)

更新/升级文档

criteria    <- list(namefirst="John", namelast="Smith")
fields      <- list(namefirst="John", namelast="Smith", age=30) …
Run Code Online (Sandbox Code Playgroud)

database r crud mongodb rmongodb

1
推荐指数
1
解决办法
1465
查看次数

标签 统计

mongodb ×8

r ×8

rmongodb ×8

rmongo ×3

bigdata ×1

crud ×1

database ×1

dataframe ×1

nosql ×1