Uso múltiple del operador posicional `$` para actualizar matrices anidadas

Esta pregunta está estrechamente relacionada conéste y consideraré los consejos dados con respecto al diseño de esquemas en un contexto NoSQL, pero tengo curiosidad por entender esto:

Preguntas reales

Supongamos que tiene el siguiente 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

Básicamente, me gustaría saber

Si es posible usar la posición de MongoDB.$ operadordetalles) varias veces, o en otras palabras, en escenarios de actualización que involucren estructuras de matriz / documento con un "grado de anidamiento" mayor que 1:

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

en lugar de "solo" poder usar$ una vez para una matriz de nivel superior y estar obligado a usar índices explícitos para matrices en "niveles superiores":

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

si es posible, cómo se vería la sintaxis de R correspondiente.

A continuación encontrarás un ejemplo reproducible. Intenté ser lo más conciso posible.

Ejemplo de códigoConexión de base de datos
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 ejemplo
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)
Actualización de matrices anidadas con índice de posición explícito (trabajos)

Esto funciona, pero implica unaexplícito índice para la matriz de segundo nivelqueries (anidado en un elemento subdoc de 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
Actualización de arrays anidados con posicional.$ índices (no funciona)

Ahora, me gustaría sustituir el explícito0 con el posicional$ operador como lo hice para que el servidor encuentre el elemento subdoc deseado de la matrizpaths (paths.$.queries).

AFAIU ladocumentación, esto debería funcionar ya que lo crucial es especificar un selector de consulta "correcto":

El operador posicional $, cuando se usa con el método update () y actúa como un marcador de posición para la primera coincidencia del selector de consultas de actualización:

Creo que especifiqué un selector de consultas quehace encontrar el elemento anidado correcto (debido a lapaths.queries.name="query1" parte):

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

Supongo que traducido a la sintaxis de "mongoDB simple", el selector de consultas se parece a esto

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

Lo que me parece un selector de consulta válido. De hecho, coincide con el elemento / doc deseado:

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

Mi pensamiento fue que si funciona en el nivel superior, ¿por qué no debería funcionar también en niveles más altos (siempre que el selector de consultas apunte a los componentes anidados correctos)?

Sin embargo, al servidor no parece gustarle un uso anidado o múltiple 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

No estoy seguro de que no funcione porque MongoDB no admite esto o si no obtuve la sintaxis R correcta.

Respuestas a la pregunta(2)

Su respuesta a la pregunta