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

这个问题与此密切相关,我将考虑在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

基本上,我想知道


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


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


而不是“仅”能够对顶级数组使用$ 一次,并且必须对“更高级别”的数组使用显式索引:


{ <update operator>: { "paths.$.queries.0.requests" : value } })(作品)


如果可能的话,相应的R语法是什么样的。


在下面,您将找到一个可复制的示例。我试图尽可能简洁。


代码示例

数据库连接

require("rmongodb")

db  <- "__unittest" 

ns  <- paste(db, "hosts", sep=".")

# CONNCETION OBJECT

con <- mongo.create(db=db)

# ENSURE EMPTY DB

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

范例文件

q <- list("_id"="abcd")

b <- list("_id"="abcd", name="unittest.com")

mongo.insert(mongo=con, ns=ns, b=b)

q <- list("_id"="abcd")

b <- list("$push"=list(paths=list(path="home")))

mongo.update(mongo=con, ns, criteria=q, objNew=b)

q <- list("_id"="abcd", paths.path="home")

b <- list("$push"=list("paths.$.queries"=list(

    name="query1", url="www.unittest.com/home?query1")))

mongo.update(mongo=con, ns, criteria=q, objNew=b)

b <- list("$push"=list("paths.$.queries"=list(

    name="query2", url="www.unittest.com/home?query2")))

mongo.update(mongo=con, ns, criteria=q, objNew=b)

使用显式位置索引更新嵌套数组(有效)

这可行,但是它涉及第二级数组的显式索引queries(嵌套在array 的subdoc元素中paths):


q <- list("_id"="abcd", paths.path="home", paths.queries.name="query1")

b <- list("$push"=list("paths.$.queries.0.requests"=list(time="2013-02-13")))

> mongo.bson.from.list(b)

    $push : 3    

        paths.$.queries.0.requests : 3   

            time : 2     2013-02-13


mongo.update(mongo=con, ns, criteria=q, objNew=b)

res <- mongo.find.one(mongo=con, ns=ns, query=q)

慕后森
浏览 503回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP