r - 更新 MongoDB 子文档中的特定字段 (rmongodb)

标签 r mongodb crud

我在理解如何更新子文档(而不是整个子文档)的特定字段的方式时遇到一些问题。

我似乎已经了解如何查询子文档中的某些字段值,但我不知道如何构建仅更改查询字段的 BSON 文档。

仍然感觉我没有完全理解“普通 MongoDB 语法”如何转换为 R 语法以及 update operators 如何完全有效。任何这方面的提示将不胜感激。

预备知识

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

db      <- "__test"
ns.0    <- "user"
ns      <- paste(db, ns.0, sep=".")
con     <- mongo.create(db=db)

确保数据库为空

mongo.remove(mongo=con, ns=ns) 

插入文档

这部分只是确保数据库中的一些示例数据。这只是一个辅助部分,你可以在心里跳过!!继续“查询”部分并查看“实际查询”以了解文档结构,这可能很难从下面的 R 代码中掌握。

文档 1 的 BSON

blist <- NULL
buf <- mongo.bson.buffer.create()
mongo.bson.buffer.append(buf, name="host", 
    value="unittest.com")
mongo.bson.buffer.start.array(buf, "paths")
mongo.bson.buffer.start.object(buf, "1")
mongo.bson.buffer.append(buf, name="path", 
    value="home")
mongo.bson.buffer.append(buf, name="url", 
    value="www.unittest.com/home")
mongo.bson.buffer.start.array(buf, "queries")
mongo.bson.buffer.start.object(buf, "1")
mongo.bson.buffer.append(buf, name="query", 
    value="?somequery")
mongo.bson.buffer.append(buf, name="url", 
    value="www.unittest.com/home?somequery")
mongo.bson.buffer.finish.object(buf) # finish query:1
mongo.bson.buffer.start.object(buf, "2")
mongo.bson.buffer.append(buf, name="query", 
    value="?someotherquery")
mongo.bson.buffer.append(buf, name="url", 
    value="www.unittest.com/home?someotherquery")
mongo.bson.buffer.finish.object(buf) # finish query:2
mongo.bson.buffer.finish.object(buf) # finish queries
mongo.bson.buffer.finish.object(buf) # finish path:1
mongo.bson.buffer.start.object(buf, "2")
mongo.bson.buffer.append(buf, name="path", 
    value="somepage")
mongo.bson.buffer.append(buf, name="url", 
    value="www.unittest.com/somepage")
mongo.bson.buffer.start.array(buf, "queries")
mongo.bson.buffer.start.object(buf, "1")
mongo.bson.buffer.append(buf, name="query", 
    value="?somequery")
mongo.bson.buffer.append(buf, name="url", 
    value="www.unittest.com/somepage?somequery")
mongo.bson.buffer.finish.object(buf) # finish query:1
mongo.bson.buffer.start.object(buf, "2")
mongo.bson.buffer.append(buf, name="query", 
    value="?someotherquery")
mongo.bson.buffer.append(buf, name="url", 
    value="www.unittest.com/somepage?someotherquery")
mongo.bson.buffer.finish.object(buf) # finish query:2
mongo.bson.buffer.finish.object(buf) # finish queries
mongo.bson.buffer.finish.object(buf) # finish path:2
mongo.bson.buffer.finish.object(buf) # finish paths
mongo.bson.buffer.finish.object(buf) # finish buf

b <- mongo.bson.from.buffer(buf)
blist <- c(blist, list(b))

文档 2 的 BSON

编辑2012-01-23

我删除了这一部分以使问题更容易理解。

实际插入

sapply(blist, function(ii) {
    mongo.insert(mongo=con, ns=ns, b=ii)
})

查询

用于查询的 BSON

buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.object(buf, "paths")
mongo.bson.buffer.start.object(buf, "$elemMatch")
mongo.bson.buffer.start.object(buf, "queries")
mongo.bson.buffer.start.object(buf, "$elemMatch")
mongo.bson.buffer.append(buf, name="query", value="?somequery")
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.finish.object(buf)
query <- mongo.bson.from.buffer(buf)
> query
    paths : 3    
        $elemMatch : 3   
            queries : 3      
                $elemMatch : 3   
                    query : 2    ?somequery

实际查询

> mongo.find.one(mongo=con, ns=ns, query=query)
    _id : 7      50feff31ba54a032514b6181
    host : 2     unittest.com
    paths : 4    
        1 : 3    
            path : 2     home
            url : 2      www.unittest.com/home
            queries : 4      
                1 : 3    
                    query : 2    ?somequery
                    url : 2      www.unittest.com/home?somequery

                2 : 3    
                    query : 2    ?someotherquery
                    url : 2      www.unittest.com/home?someotherquery



        2 : 3    
            path : 2     somepage
            url : 2      www.unittest.com/somepage
            queries : 4      
                1 : 3    
                    query : 2    ?somequery
                    url : 2      www.unittest.com/somepage?somequery

                2 : 3    
                    query : 2    ?someotherquery
                    url : 2      www.unittest.com/somepage?someotherquery

正在更新

用于更新的 BSON

我想设置 query 子文档中 query 字段的值。我看了MongoDB Manual并尝试了类似的操作(使用 $set$ 运算符,因为涉及数组):

buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.object(buf, "$set")
mongo.bson.buffer.start.object(buf, "paths")
mongo.bson.buffer.start.object(buf, "$")
mongo.bson.buffer.start.object(buf, "queries")
mongo.bson.buffer.start.object(buf, "$")
mongo.bson.buffer.append(
    buf, 
    name="name", 
    value="abcd"
)
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.finish.object(buf)
mongo.bson.buffer.finish.object(buf)
bnew <- mongo.bson.from.buffer(buf)

> bnew
    $set : 3     
        paths : 3    
            $ : 3    
                queries : 3      
                    $ : 3    
                        name : 2     abcd

实际更新

显然,这不是一个好的选择;-)

res <- mongo.update(mongo=con, ns=ns, criteria=query, 
    objNew=bnew, flags=mongo.update.multi)

> res
[1] FALSE

2 : http://docs.mongodb.org/manual/applications/update/#update-operators zU

最佳答案

尝试一下 bnew:

buf <- mongo.bson.buffer.create()
mongo.bson.buffer.start.object(buf, "$set")
mongo.bson.buffer.append(buf, "paths.0.queries.1.query", "?newquery")
mongo.bson.buffer.finish.object(buf)
bnew = mongo.bson.from.buffer(buf)

这将替换第一个查询中的第二个查询。

关于r - 更新 MongoDB 子文档中的特定字段 (rmongodb),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14468284/

相关文章:

javascript - 如何处理在 Mongodb 中存储为字符串的日期?

java - 如何删除Java控制台的MongoDB消息?

javascript - 如何在 Javascript 中定义 URL 以调用驻留在 Controller 中的 ActionResult 方法

r - 如何使用 R 的 sprintf 创建固定宽度的字符串,并在 END 处填充空白?

R 工具提示数据点

javascript - Mongoose + Mongodb User.update 不起作用

java - Aerospike 集群中多个集合(表)的多次操作

r - 获取调用对象,更改参数并使用新参数再次运行

javascript - 用新数据替换现有的 R Shiny htmlwidget 数据

javascript - ColdFusion - 查询数据表和 CRUD 操作的方法