Uso múltiplo do operador posicional `$` para atualizar matrizes aninhadas

Esta questão está intimamente relacionadaeste e vou considerar o conselho dado em relação ao design do esquema em um contexto NoSQL, mas estou curioso para entender isso:

Perguntas reais

Suponha que você tenha o seguinte documento:

    _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

Basicamente, eu gostaria de saber

se é possível usar o posicional do MongoDB$ operador (detalhes) várias vezes, ou de forma diferente, em cenários de atualização que envolvem estruturas de matriz / documento com um "grau de aninhamento" maior que 1:

{ <update operator>: { "paths.$.queries.$.requests" : value } } (não funciona)

em vez de "apenas" poder usar$ uma vez para uma matriz de nível superior e sendo obrigado a usar índices explícitos para matrizes em "níveis mais altos":

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

se possível, como seria a sintaxe R correspondente.

Abaixo você encontrará um exemplo reproduzível. Eu tentei ser o mais conciso possível.

Exemplo de códigoConexão de banco de dados
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)
Documento de exemplo
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)
Atualização de matrizes aninhadas com índice de posição explícito (trabalhos)

Isso funciona, mas envolve umexplícito índice para o array de segundo nívelqueries (aninhado em um elemento subdoc da matrizpaths):

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)
> res
    _id : 2      abcd
    name : 2     unittest.com
    paths : 4    
        0 : 3    
            path : 2     home
            queries : 4      
                0 : 3    
                    name : 2     query1
                    requests : 4     
                        0 : 3    
                            time : 2     2013-02-13


                    url : 2      www.unittest.com/home?query1

                1 : 3    
                    name : 2     query2
                    url : 2      www.unittest.com/home?query2
Atualização de matrizes aninhadas com posicionamento posicional$ índices (não funciona)

Agora, gostaria de substituir o explícito0 com o posicional$ operador assim como eu fiz para que o servidor encontre o elemento subdoc desejado da matrizpaths (paths.$.queries).

AFAIU odocumentação, isso deve funcionar, pois o mais importante é especificar um seletor de consulta "correto":

O operador $ posicional, quando usado com o método update () e atua como um espaço reservado para a primeira correspondência do seletor de consulta de atualização:

Eu acho que eu especifiquei um seletor de consulta quefaz encontrar o elemento aninhado correto (devido àpaths.queries.name="query1" parte):

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

Eu acho que traduzido para a sintaxe "MongoDB simples", o seletor de consulta se parece um pouco com isso

{ _id: abcd, paths.path: home, paths.queries.name: query1 }

o que parece ser um seletor de consulta válido para mim. Na verdade, ele corresponde ao elemento / doc desejado:

> !is.null(mongo.find.one(mongo=con, ns=ns, query=q))
[1] TRUE

Meu pensamento era que, se funciona no nível superior, por que não deveria funcionar também para níveis mais altos (contanto que o seletor de consulta aponte para os componentes aninhados à direita)?

No entanto, o servidor não parece gostar de um uso aninhado ou múltiplo de$:

b <- list("$push"=list("paths.$.queries.$.requests"=list(time="2013-02-14")))
> mongo.bson.from.list(b)
    $push : 3    
        paths.$.queries.$.requests : 3   
            time : 2     2013-02-14

> mongo.update(mongo=con, ns, criteria=q, objNew=b)
[1] FALSE

Não tenho certeza se isso não funciona porque o MongoDB não suporta isso ou se eu não consegui a sintaxe R correta.

questionAnswers(2)

yourAnswerToTheQuestion