Сначала я хотел добавить комментарий к сообщению Duncan Smart, но, к сожалению, у меня еще недостаточно репутации, чтобы оставлять комментарии. Поэтому я попробую его здесь.
Я просто хочу предупредить о побочных эффектах.
JsonTextReader внутренне анализирует json на типизированные JTokens и затем сериализует их обратно.
Например, если ваш оригинальный JSON был
{ "double":0.00002, "date":"\/Date(1198908717056)\/"}
После префикса вы получаете
{
"double":2E-05,
"date": "2007-12-29T06:11:57.056Z"
}
Конечно, обе строки json эквивалентны и десериализуются для структурного равные объекты, но если вам нужно сохранить исходные строковые значения, вам нужно принять это во внимание
Согласно документам , это точно то же самое. Однако использование Schema также добавило бы поле _id
(если у вас этого нет), и предположительно использует еще несколько ресурсов для отслеживания поддоков.
Синтаксис альтернативной декларации
Новое в v3 Если вам не нужен доступ к экземпляру схемы субдоку, вы также можете объявить субдоку, просто передав объектный литерал [...]
Вы должны использовать встроенные документы, если это статические документы или не более нескольких сотен из-за воздействия производительности. Некоторое время назад я рассказывал об этой проблеме. Недавно Ася Камский, которая работает архитектором решений для MongoDB, написала статью о «использовании поддокументов».
Надеюсь, это поможет тем, кто ищет решения или лучшую практику.
Оригинальная публикация на http://askasya.com/post/largeembeddedarrays , Вы можете связаться с ее профилем stackoverflow на https://stackoverflow.com/users/431012/asya-kamsky
Прежде всего, мы должны рассмотреть, почему мы хочу сделать такое. Обычно я бы посоветовал людям вставлять вещи, которые они всегда хотят вернуть, когда они извлекают этот документ. Оборотная сторона этого заключается в том, что вы не хотите вставлять элементы в документ, с которым вы не хотите возвращаться.
Если вы вставляете активность, которую я выполняю в документе, это будет сначала работайте, потому что вся моя деятельность прямо там и с одним чтением вы можете вернуть все, что вы могли бы мне показать: «вы недавно нажали на это, и вот ваши последние два комментария», но что происходит после шести месяцев и я не забочусь о вещах, которые я делал давно, и вы не хотите показывать их мне, если я специально не пойду на какую-то старую деятельность?
Во-первых, вы закончите возвращая больший и больший документ и заботясь о меньшей и меньшей его части. Но вы можете использовать проекцию, чтобы возвращать только часть массива, реальная боль в том, что документ на диске станет больше, и он все равно будет прочитан, даже если вы собираетесь вернуть часть его конечному пользователю, но поскольку моя деятельность не останавливается до тех пор, пока я активен, документ будет продолжать расти и расти.
Наиболее очевидная проблема с этим - в конечном итоге вы попадете в ограничение на 16 МБ, но это совсем не то, что вас беспокоит. Документ, который постоянно растет, будет нести все большую и большую стоимость каждый раз, когда он должен быть перемещен на диск, и даже если вы предпримете шаги для смягчения последствий фрагментации, ваши записи в целом будут излишне длинными, что скажется на общей производительности всего вашего приложения.
Есть еще одна вещь, которую вы можете сделать, которая полностью уничтожит производительность вашего приложения, и это будет индексировать этот постоянно растущий массив. Это означает, что каждый раз, когда документ с этим массивом перемещается, количество индексных записей, которые необходимо обновить, прямо пропорционально количеству индексированных значений в этом документе, и чем больше массив, тем больше это число будет быть.
Я не хочу, чтобы это пугало вас от использования массивов, когда они хорошо подходят для модели данных - они являются мощной функцией модели данных базы данных документов, но, как и все мощные инструменты, его необходимо использовать при правильных обстоятельствах, и его следует использовать с осторожностью.
Если у вас есть схемы, которые повторно используются в разных частях вашей модели, тогда было бы полезно определить отдельные схемы для дочерних документов, чтобы вам не пришлось дублировать себя.
В принципе создайте переменную 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"
]
}
Пример: