Subdocumentos de mangosta vs esquema anidado


Tengo curiosidad en cuanto a los pros y los contras de usar subdocumentos vs una capa más profunda en mi esquema principal:

var subDoc = new Schema({
  name: String
});

var mainDoc = new Schema({
  names: [subDoc]
});

O

var mainDoc = new Schema({
  names: [{
    name: String
 }]
});

Actualmente estoy usando subdocs en todas partes, pero me pregunto principalmente sobre el rendimiento o los problemas de consulta que podría encontrar.

Author: Ates Goral, 2013-03-04

5 answers

De acuerdo con los documentos, es exactamente lo mismo. Sin embargo, el uso de un Esquema también agregaría un campo _id (siempre y cuando no lo tenga deshabilitado), y presumiblemente utiliza algunos recursos más para rastrear subdocs.

Sintaxis de declaración alternativa

Nuevo en v3 Si no necesita acceso a la instancia de esquema de sub-documento, también puede declarar sub-docs simplemente pasando un objeto literal [...]

 49
Author: AndyL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-21 10:26:46

Si tiene esquemas que se reutilizan en varias partes de su modelo, puede ser útil definir esquemas individuales para los documentos secundarios para que no tenga que duplicarse.

 30
Author: sonstone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-20 18:20:03

Creo que esto se maneja en otro lugar por múltiples post en SO.

Solo unos pocos:

La gran clave es que no hay una sola respuesta aquí, solo un conjunto de compensaciones bastante complejas.

 10
Author: Gates VP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:45

Debe usar documentos incrustados si son documentos estáticos o no son más de unos pocos cientos debido al impacto en el rendimiento. He hablado de ese tema hace un tiempo. Recientemente, Asya Kamsky que trabaja como arquitecto de soluciones para MongoDB había escrito un artículo sobre "el uso de subdocumentos".

Espero que eso ayude a quien está buscando soluciones o la mejor práctica.

Post original en http://askasya.com/post/largeembeddedarrays . Puedes llegar a ella. perfil de stackoverflow en https://stackoverflow.com/users/431012/asya-kamsky

En primer lugar, tenemos que considerar por qué querríamos hacer tal cosa. Normalmente, aconsejaría a la gente que incrustara cosas que siempre quieren volver cuando están recuperando este documento. Tirón el lado de esto es que no desea incrustar cosas en el documento que no quieres volver con ella.

Si incrustas la actividad que realizo en el documento, trabajar muy bien en primero porque toda mi actividad está ahí y con una sola lectura puedes recuperar todo lo que quieras mostrarme: "recientemente haga clic en esto y aquí están sus dos últimos comentarios " pero lo que sucede después de seis meses pasan y no me importan las cosas que hice mucho tiempo hace y no quieres mostrármelos a menos que vaya específicamente a ¿busca alguna actividad antigua?

Primero, terminarás devolviendo un documento cada vez más grande y cariñoso sobre porción cada vez más pequeña de ella. Pero puedes usar proyección para solo devuelve parte de la matriz, el verdadero dolor es que el documento en disco se hará más grande y todavía todo será leído incluso si usted es sólo voy a devolver parte de ella al usuario final, pero ya que mi actividad es no va a parar mientras esté activo, el documento continuará creciendo y creciendo.

El problema más obvio con esto es que eventualmente alcanzarás los 16MB límite de documentos, pero eso no es en absoluto lo que usted debe estar preocupado sobre. Un documento que crece continuamente incurrirá cada vez más alto costo cada vez que tiene que ser reubicado en el disco, e incluso si usted toma pasos para mitigar los efectos de la fragmentación, sus escrituras en general ser innecesariamente largo, afectando el rendimiento general de su toda la aplicación.

Hay una cosa más que puede hacer que matará completamente a su rendimiento de la aplicación y que es indexar esta cada vez mayor matriz. Lo que eso significa es que cada vez que el documento con esta matriz se reubica, el número de entradas de índice que deben ser actualizado es directamente proporcional al número de valores indexados en ese documento, y cuanto mayor sea la matriz, mayor será el número ser.

No quiero que esto te asuste de usar arrays cuando son buenos ajuste para el modelo de datos-son una característica poderosa del documento modelo de datos de base de datos, pero como todas las herramientas poderosas, necesita utilizar en las circunstancias adecuadas y debe utilizarse con cuidado.

 10
Author: efkan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:31

Básicamente, crea una variable nestedDov y ponla aquí name: [nestedDov]

Versión simple:

var nestedDoc = new Schema({
  name: String
});

var mainDoc = new Schema({
  names: [nestedDoc]
});

JSON Example

{
    "_id" : ObjectId("57c88bf5818e70007dc72e85"),
    "name" : "Corinthia Hotel Budapest",
    "stars" : 5,
    "description" : "The 5-star Corinthia Hotel Budapest on the Grand Boulevard offers free access to its Royal Spa",
    "photos" : [
        "/photos/hotel/corinthiahotelbudapest/1.jpg",
        "/photos/hotel/corinthiahotelbudapest/2.jpg"
    ],
    "currency" : "HUF",
    "rooms" : [
        {
            "type" : "Superior Double or Twin Room",
            "number" : 20,
            "description" : "These are some great rooms",
            "photos" : [
                "/photos/room/corinthiahotelbudapest/2.jpg",
                "/photos/room/corinthiahotelbudapest/5.jpg"
            ],
            "price" : 73000
        },
        {
            "type" : "Deluxe Double Room",
            "number" : 50,
            "description" : "These are amazing rooms",
            "photos" : [
                "/photos/room/corinthiahotelbudapest/4.jpg",
                "/photos/room/corinthiahotelbudapest/6.jpg"
            ],
            "price" : 92000
        },
        {
            "type" : "Executive Double Room",
            "number" : 25,
            "description" : "These are amazing rooms",
            "photos" : [
                "/photos/room/corinthiahotelbudapest/4.jpg",
                "/photos/room/corinthiahotelbudapest/6.jpg"
            ],
            "price" : 112000
        }
    ],
    "reviews" : [
        {
            "name" : "Tamas",
            "id" : "/user/tamas.json",
            "review" : "Great hotel",
            "rating" : 4
        }
    ],
    "services" : [
        "Room service",
        "Airport shuttle (surcharge)",
        "24-hour front desk",
        "Currency exchange",
        "Tour desk"
    ]
}

Ejemplo:

introduzca la descripción de la imagen aquí

 8
Author: Wayne Chiu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-02 20:31:38