Разница Mongoose между встроенными документами и встроенными схемами [duplicate]

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

Я просто хочу предупредить о побочных эффектах.

JsonTextReader внутренне анализирует json на типизированные JTokens и затем сериализует их обратно.

Например, если ваш оригинальный JSON был

 { "double":0.00002, "date":"\/Date(1198908717056)\/"}

После префикса вы получаете

{ 
    "double":2E-05,
    "date": "2007-12-29T06:11:57.056Z"
}

Конечно, обе строки json эквивалентны и десериализуются для структурного равные объекты, но если вам нужно сохранить исходные строковые значения, вам нужно принять это во внимание

90
задан Ates Goral 28 January 2016 в 23:29
поделиться

5 ответов

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

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

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

46
ответ дан w00t 22 August 2018 в 12:22
поделиться
  • 1
    Но я попробовал это. Почему данные вспомогательных документов не хранятся в отдельной коллекции. Он всегда хранится внутри коллекции mainDoc. – Fizer Khan 27 May 2013 в 12:13
  • 2
    вот как работают вспомогательные документы. они внедряются внутри документа. перед игрой с мангустом, убедитесь, что вы понимаете базовый MongoDB. – AndyL 31 May 2013 в 18:06
  • 3
    Что касается добавления схемы _id, это имеет смысл, но я создал схему с массивом субдокторов и массив объектных литералов, а для обоих добавлен _id. Поведение изменилось? – Drew Goodwin 3 May 2016 в 17:12
  • 4
    @DrewGoodwin кажется, что это было похоже на некоторое время: stackoverflow.com/questions/17254008/… – cheesemacfly 10 May 2016 в 18:28

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

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

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

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

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

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

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

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

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

10
ответ дан Community 22 August 2018 в 12:22
поделиться
  • 1
    Возможно, я не правильно формулирую свой вопрос. Это не вопрос того, как я должен структурировать свою базу данных, а внутреннюю часть использования подсхемы, а не просто писать массив на более глубоком уровне. Моя основная причина использования подсхемы состоит в том, что я могу использовать пользовательские типы схем и проверять их - что-то, что не работает с вложенными массивами (из предыдущего вопроса, который я имел на SO). Почти так же, как я могу сказать, subdoc почти такой же, как вложенный массив, я просто не знаю его внутренних элементов - если их использование создаст проблемы с производительностью или что-то подобное. – cyberwombat 5 March 2013 в 01:44
  • 2
    Это должен быть главный ответ; это забивает деньги. Собственные белые бумаги MongoDB говорят примерно то же самое. – Jay Edwards 13 September 2017 в 21:22

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

28
ответ дан sonstone 22 August 2018 в 12:22
поделиться
  • 1
    Это отличный ответ. Иногда я использую субдокументы в большей части одной модели, или у меня есть два поля в модели, которые нужно различать, но все же имеют одну и ту же структуру поддокумента. – Martin Hallén 9 July 2014 в 10:17
  • 2
    вы также должны учитывать преимущества / недостатки экономии избыточной информации. – Sam Vloeberghs 24 November 2014 в 10:37

В принципе создайте переменную 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"
    ]
}

Пример:

8
ответ дан Wayne Chiu 22 August 2018 в 12:22
поделиться
  • 1
    Это не затрагивает вопрос вообще, что является одним из результатов. – cyberwombat 2 September 2016 в 16:34
  • 2
    Я немного отредактировал, чтобы иметь больше смысла. Как вы думаете? – Wayne Chiu 2 September 2016 в 20:32
  • 3
    Вопрос не в том, как делать вложенные схемы. Его обсуждение вопроса о том, является ли Mongoose более эффективным с вложенными схемами или встроенными вспомогательными документами. В основном мы говорим о бенчмарках или сортах или крайних случаях, когда Mongoose предпочитает друг друга. И, как говорится в выбранном ответе, это не имеет никакого значения, по крайней мере, от V3. – cyberwombat 2 September 2016 в 21:50
  • 4
    хорошо, спасибо много! Мне жаль, что я это неправильно понял. – Wayne Chiu 5 September 2016 в 17:08
  • 5
    Может быть, не работает для OP, но я нашел это очень полезным. Благодарю. – Gene Higgins 12 November 2016 в 18:44
10
ответ дан Community 5 November 2018 в 09:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: