javascript remove Поддокументы Mongoose против вложенной схемы



html title attribute (4)

Мне любопытно относиться к плюсам и минусам использования поддокументов и более глубокого слоя в моей основной схеме:

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

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

или

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

В настоящее время я использую поддоки везде, но мне интересно в первую очередь о производительности или запросах, с которыми я мог столкнуться.


Answer #1

Если у вас есть схемы, которые повторно используются в разных частях вашей модели, может быть полезно определить отдельные схемы для дочерних документов, чтобы вам не пришлось дублировать себя.


Answer #2

Вы должны использовать встроенные документы, если это статические документы или не более нескольких сотен из-за воздействия производительности. Некоторое время назад я рассказывал об этой проблеме. Недавно Ася Камский, которая работает архитектором решений для MongoDB, написала статью о «использовании поддокументов».

Надеюсь, это поможет тем, кто ищет решения или передовой опыт.

Оригинальное сообщение на http://askasya.com/post/largeembeddedarrays . Вы можете связаться со своим профилем на https://.com/users/431012/asya-kamsky

Прежде всего, мы должны рассмотреть, почему мы хотели бы сделать такое. Обычно я бы посоветовал людям вставлять вещи, которые они всегда хотят вернуть, когда они извлекают этот документ. Оборотная сторона этого заключается в том, что вы не хотите вставлять вещи в документ, с которым вы не хотите возвращаться.

Если вы включите активность, которую я выполняю в документе, она будет работать отлично, потому что вся моя деятельность прямо там и с помощью одного чтения вы можете вернуть все, что вы могли бы мне показать: «вы недавно нажали на это и здесь ваши последние два комментария », но что происходит после шести месяцев, и мне все равно, что я делал давно, и вы не хотите показывать их мне, если я специально не пойду на какую-то старую деятельность?

Во-первых, вы в конечном итоге возвращаете больший и больший документ и заботитесь о его меньшей и меньшей его части. Но вы можете использовать проекцию, чтобы возвращать только часть массива, реальная боль в том, что документ на диске станет больше, и он все равно будет прочитан, даже если вы собираетесь вернуть часть его конечному пользователю, но поскольку моя деятельность не прекратится, пока я активен, документ будет продолжать расти и расти.

Самая очевидная проблема с этим - в конечном итоге вы попадете в 16-мегабайтный лимит документа, но это совсем не то, о чем вас беспокоит. Документ, который постоянно растет, будет нести все большую и большую стоимость каждый раз, когда он должен быть перемещен на диск, и даже если вы предпримете шаги для смягчения последствий фрагментации, ваши записи в целом будут излишне длинными, что скажется на общей производительности всего вашего приложения.

Еще одна вещь, которую вы можете сделать, полностью уничтожит производительность вашего приложения, и это позволит индексировать этот постоянно растущий массив. Это означает, что каждый раз, когда документ с этим массивом перемещается, количество индексных записей, которые необходимо обновить, прямо пропорционально количеству индексированных значений в этом документе, и чем больше массив, тем больше это число будет быть.

Я не хочу, чтобы это пугало вас от использования массивов, когда они хорошо подходят для модели данных - они являются мощной функцией модели данных базы данных документов, но, как и все мощные инструменты, ее необходимо использовать при правильных обстоятельствах и его следует использовать с осторожностью.


Answer #3

В принципе, создайте переменную nestedDov и поместите ее здесь name: [nestedDov]

Простая версия:

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

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

Пример JSON

{
    "_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"
    ]
}

Пример:


Answer #4

Согласно документам , это точно то же самое. Однако использование Schema также добавило бы поле _id (пока у вас этого нет), и, по-видимому, использует еще несколько ресурсов для отслеживания поддоменов.

Синтаксис альтернативной декларации

Новое в версии 3 Если вам не нужен доступ к экземпляру схемы субдоку, вы также можете объявить субдоки простым прохождением литерала объекта [...]





mongoose