sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongodb encuentra dentro de la matriz secundaria

Está en el camino correcto, pero hay algunas cosas que debe tener en cuenta aquí, además de la parte de que las matrices anidadas (y especialmente con claves anónimas) no son exactamente una excelente manera de almacenar cosas, pero siempre que sepa la posición constantemente, entonces eso debería estar razonablemente bien.

Hay una clara diferencia entre documentos coincidentes y haciendo coincidir "elementos de una matriz" . Aunque su valor actual en realidad no coincidiría (su valor de búsqueda no está dentro de los límites del documento), si el valor en realidad fuera válido, su consulta coincidiría correctamente con el "documento" aquí, que contiene un elemento coincidente en la matriz.

El "documento" contiene todos de los elementos de la matriz, incluso aquellos que no coinciden, pero la condición dice "documento" coincide, por lo que se devuelve. Si solo desea los "elementos" coincidentes luego use .aggregate() en cambio:

    db.infos.aggregate([
        // Still match the document
        { "$match": { 
            "info": { 
                "$elemMatch": { "0": {"$gte": 1399583285000} }
            }
        }},

        // unwind the array for the matched documents
        { "$unwind": "$info" },

        // Match only the elements
        { "$match": { "info.0": { "$gte": 1399583285000 } } },

        // Group back to the original form if you want
        { "$group": {
            "_id": "$_id",
            "info": { "$push": "$info" }
        }}

    ])

Y eso devuelve solo los elementos que coincidieron con la condición:

{
    "_id" : ObjectId("536c1145e99dc11e65ed07ce"),
    "info" : [
            [
                    1399583285000,
                    20.13
            ],
            [
                    1399583286000,
                    20.13
            ]
    ]
}

O, por supuesto, si solo esperabas uno elemento para que coincida, simplemente podría usar la proyección con .find() **:

db.infos.find(
    {
       "info":{
          "$elemMatch":{
             "0": {
                "$gt": 1399583285000
             }
          }
       }
    },
    {
        "info.$": 1
    }
)

Pero con un término como $gt es probable que obtenga múltiples resultados dentro de un documento, por lo que el enfoque agregado será más seguro considerando que el $ posicional el operador solo devolverá el primero partido.