Tengo una colección llamada "dispositivos" con aproximadamente 50.000 documentos. Estoy tratando de consultar la matriz de "rutas" dentro de cada documento y hacer que devuelva el documento si se cumplen varias condiciones para los elementos individuales de la matriz. El problema es que parece que Mongo está devolviendo respuestas donde se satisfacen las múltiples condiciones para diferentes elementos de la matriz.

Datos de muestra:

{
    "_id": 0,
    "name": "example1",
    "serial": "123456",
    "routes": [
        {
            "description": "8989",
            "zone": "front"
        },
        {
            "description": "1221",
            "zone": "back"
        }
    ]
},
{
    "_id": 1,
    "name": "example2",
    "serial": "987654",
    "routes": [
        {
            "description": "1515",
            "zone": "front"
        },
        {
            "description": "8989",
            "zone": "side"
        }
    ]
}

Probé variaciones simples .find () sin suerte, incluyendo

db.devices.find({"routes.description":"8989", "routes.zone":"front"})
db.devices.find({"$and": [{"routes.description":"8989"}, {"routes.zone":"front"}]})

También probé agregaciones que parecen fallarme ya que mi comprensión de ellas es elemental. Los resultados deseados para las consultas anteriores serían un solo documento ("_id": 0) y no ambos documentos.

{ "_id" : 0, "name" : "example1", "serial" : "123456", "routes" : [ { "description" : "8989", "zone" : "front" }, { "description" : "1221", "zone" : "back" } ] }

Además, sería deseable la capacidad de consultar la matriz utilizando el operador $ in. Por ejemplo, el resultado deseado de la siguiente consulta serían ambos documentos, ya que ambos tienen rutas que coinciden con "zona": "frente" y "descripciones" que están en la lista.

db.devices.find({"$and": [{"routes.description": { $in: ["8989", "1515"] }}, {"routes.zone":"front"}]})
0
r6danl99 31 ago. 2020 a las 22:43

1 respuesta

La mejor respuesta

Simplemente necesita usar $ elemMatch aquí

db.devices.find({routes: {$elemMatch: {description:"8989", zone:"front"}}})

Ejemplo

0
namar sood 31 ago. 2020 a las 21:30