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