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

mongodb $where consulta para obtener el contenido del subdocumento

Uso de $where se debe evitar el operador en la mayoría de los casos, ya que ambos invocarán un escaneo completo de la colección, independientemente de qué otras condiciones puedan usar una selección de índice.

Además, está invocando el intérprete de JavaScript sobre cada documento de resultados, que será considerablemente más lento que el código nativo. Lea las advertencias en la página del manual, están ahí por una razón

Siempre que sea posible, intente utilizar .aggregate() para este tipo de comparación en su lugar. En tu caso definitivamente es la mejor opción:

db.foo.aggregate([
    { "$match": { "flag": true } },
    { "$unwind": "$versions" },
    { "$project": {
        "versions": "$versions"
        "same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
    }}
    { "$match": { "same": true } },
    { "$project": {
        "_id": 0,
        "versions": 1
    }}
])

Esto le permite filtrar primero su consulta por la condición de "bandera" y luego inspeccionar cada miembro de la matriz para comparar si los dos campos son iguales.

Si es necesario, puede revertir los elementos de matriz coincidentes en una matriz donde haya más de una coincidencia. Pero no creo que ese sea tu requisito.