Pregunta

Tengo algunos documentos en la colección "empresa" estructurados de esta manera:

[
    {
        "company_name": "Company 1",
        "contacts": {
            "main": {
                "email": "main@company1.com",
                "name": "Mainuser"
            },
            "store1": {
                "email": "store1@company1.com",
                "name": "Store1 user"
            },
            "store2": {
                "email": "store2@company1.com",
                "name": "Store2 user"
            }
        }
    },
    {
        "company_name": "Company 2",
        "contacts": {
            "main": {
                "email": "main@company2.com",
                "name": "Mainuser"
            },
            "store1": {
                "email": "store1@company2.com",
                "name": "Store1 user"
            },
            "store2": {
                "email": "store2@company2.com",
                "name": "Store2 user"
            }
        }
    }
]

Estoy intentando recuperar el documento que tiene store1@company2.com como contacto pero no encuentro cómo consultar un valor específico de una propiedad específica de una lista de objetos "indexados".

Mi sensación es que las listas de contactos no deberían indexarse, lo que da como resultado la siguiente estructura:

{
    "company_name": "Company 1",
    "contacts": [
        {
            "email": "main@company1.com",
            "name": "Mainuser",
            "label": "main"
        },
        {
            "email": "store1@company1.com",
            "name": "Store1 user",
            "label": "store1"
        },
        {
            "email": "store2@company1.com",
            "name": "Store2 user",
            "label": "store2"
        }
    ]
}

De esta manera puedo recuperar documentos coincidentes a través de la siguiente solicitud:

db.company.find({"contacts.email":"main@company1.com"})

Pero, ¿hay alguna forma de realizar una solicitud similar en un documento utilizando la estructura anterior?

¡Muchas gracias por sus respuestas!

PD:La misma pregunta para documentos estructurados de esta manera:

    {
        "company_name": "Company 1",
        "contacts": {
            "0": {
                "email": "main@company1.com",
                "name": "Mainuser"
            },
            "4": {
                "email": "store1@company1.com",
                "name": "Store1 user"
            },
            "1": {
                "email": "store2@company1.com",
                "name": "Store2 user"
            }
        }
    }
¿Fue útil?

Solución

Respuesta corta:sí, se pueden consultar, pero probablemente no sea lo que desea y no será realmente eficiente.

La estructura del documento en el primer y tercer bloque es básicamente la misma: tiene un documento incrustado.La única diferencia entre ellos es el nombre de las claves en el contacts objeto.

Para consultar un documento con ese tipo de estructura tendrás que hacer una consulta como esta:

db.company.find({ $or : [
   {"contacts.main.email":"main@company1.com"},
   {"contacts.store1.email":"main@company1.com"},
   {"contacts.store2.email":"main@company1.com"}
]});

Esta consulta no será eficiente, especialmente si tiene muchos keys en el contacts objeto.Además, crear una consulta será innecesariamente difícil y propenso a errores.

La segunda estructura del documento, con una serie de objetos incrustados, es óptima.Puedes crear un índice multiclave en la matriz de contactos lo que agilizará su consulta.La ventaja es que puedes utilizar una consulta breve y sencilla.

Otros consejos

Creo que lo más fácil es realmente dar forma a su documento utilizando la estructura describe en su 2º ejemplo: (no he fijado el JSON)

{
 "company_name": "Company 1",
 "contacts":{[
   {"email":"main@company1.com","name":"Mainuser", "label": "main", ...}
   {"email":"store1@company1.com","name":"Store1 user", "label": "store1",...}
   {"email":"store2@company1.com","name":"Store2 user", "label": "store2",...}
  ]}

}

Así que puede consultar fácilmente en el correo electrónico independientemente de la "Etiqueta".

Entonces, si realmente desea utilizar la otra estructura, (pero debe arreglar el JSON también), deberá escribir más tuberías de código / agregación complejas, ya que no conocemos el nombre y el número de atributos al consultar elsistema.Las tesis estructuras también son probablemente difíciles de usar por los desarrolladores independientemente de las consultas de MongOdb.

Dado que no estaba claro, déjame mostrar lo que tengo en mente

db.company.save(
  {
     "company_name": "Company 1",
     "contacts":[
        {"email":"main@company1.com","name":"Mainuser", "label": "main"},
        {"email":"store1@company1.com","name":"Store1 user", "label": "store1"},
        {"email":"store2@company1.com","name":"Store2 user", "label": "store2"}
      ]
  }
);

db.company.save(
  {
    "company_name": "Company 2",
    "contacts":[
      {"email":"main@company2.com","name":"Mainuser", "label": "main"},
      {"email":"store1@company2.com","name":"Store1 user", "label": "store1"},
      {"email":"store2@company2.com","name":"Store2 user", "label": "store2"}
    ]
  }
); 

db.company.ensureIndex( { "contacts.email" : 1  } );

db.company.find( { "contacts.email" : "store1@company2.com" } );

Esto le permite almacenar muchos correos electrónicos, y consultar con un índice.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top