Nano Hash - криптовалюты, майнинг, программирование

MongoDB работает с несколькими объектами с полем заказа

Представим, что есть какая-то презентация, содержащая много слайдов. Коллекция презентаций в монго может быть представлена ​​так: { _id: <presentation_id>, author: <author_name>, ... }

И есть коллекция слайдов, содержащая слайды для этих презентаций: { _id: <slide_id>, presentation_id: <presentation_id>, content: <content(html,text, etc.)>, order: <slide_order (page number)> /* This field is used to place slides in correct order during showcase*/ }

Как и во всех презентациях, слайды можно добавлять, перемещать, удалять и т. д., и он должен автоматически сохранять изменения после каждой операции. С такой схемой при каждом добавлении или перемещении слайда нам нужно обновлять множество слайдов с их порядковым значением. В метеоре это приводит к довольно большому времени ожидания (т.е. для презентации с 250 слайдами, если мы добавим 1 слайд в ее начало, нам нужно обновить 250 существующих слайдов в цикле for).

Я также подумал о двух вещах, как с этим справиться: 1) Добавить в presentation новое поле slides, которое будет массивом, содержащим идентификаторы слайдов в последовательном порядке. Но у этого способа есть проблема с упорядочением: на данный момент mongodb не может упорядочить результаты по массиву id (в версиях ‹=2.4 был хак с использованием $or, но в 2.6 он уже недоступен) без использования фреймворка агрегации (которого нет). т присутствует в метеоре из коробки и требует дополнительных модулей). Это заменит большое количество небольших обновлений одним большим обновлением.

2) Другой способ — заменить поле order в коллекции слайдов двумя новыми полями: prev и next и сохранить только идентификаторы следующего и предыдущего слайдов. Это уменьшит (повторно) операции перемещения/добавления до нескольких небольших обновлений, но когда мне нужно показать все слайды, мне нужно будет сделать это в два этапа: получить слайды из БД в неправильном порядке, найти первый (последний) слайд и восстановить правильный порядок, используя следующие/предыдущие «ссылки».

Какой способ предпочтительнее? Или может есть другой лучший способ сделать это?

02.07.2014

Ответы:


1

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

Потому что почти в каждом случае использования коллекции слайдов вам также понадобятся данные из коллекции презентаций. Массив всегда упорядочен, поэтому вам не нужно/требовать поле _id для слайда.

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

Затем вы можете использовать модификаторы обновления массива mongodb для перемещения слайдов в коллекция. Для добавления особенно полезен модификатор $position. И вы можете комбинировать $splice и $push для перемещения вещей.

Изменить: используйте $inc в своем обновлении, например:

Вставка слайда в середину порядка:

 col.update({presentation_id:xxx, order:{$gte:20}},{$inc:{order:1}},{multi:true});
 col.insert({order:20, presentation_id:xxx/*otherdata*/});

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

Перемещение документа вниз:

 var moveSlide = col.findOne({presentation_id:xxx, order:20});
 col.update({presentation_id:xxx, {order:{$lte:20}}},{$inc:{order:1}},{multi:true});
 col.update(moveSlide._id, {$set:{order:1}});

Перемещение документа вверх:

 var moveSlide = col.findOne({presentation_id:xxx, order:20});
 col.update({presentation_id:xxx, $and:[{order:{$lte:100}}, {order:{$gte:20}}]},{$inc:{order:-1}},{multi:true});
 col.update(moveSlide._id, {$set:{order:100}});
02.07.2014
  • Я думал об этом, но в нашем случае есть много презентаций, которые можно было бы просто перечислить (без необходимости доступа к слайдам). И при таком подходе нам понадобится 2 отдельных публикации для презентаций со слайдами и без них (чтобы избежать лишних накладных расходов). И ограничение в 16 Мб — еще одна причина, по которой я его не использовал, потому что пока у нас довольно маленькие презентации (изображения, файлы идут в отдельную коллекцию), но в будущем он может содержать svg-графику или события, закодированные в base64, и это может привести к серьезным последствиям. ограничения. 02.07.2014
  • Спасибо, завтра попробую. 02.07.2014
  • Все работало. Спасибо еще раз. В вашем коде были некоторые ошибки (для вверх и вниз): Переместить элемент (slide_id) вниз (newPos › oldPos): Slides.update({pres_id: pres_id, _id:{$ne:slide_id}, $and: [{order: {$gte: oldPos}}, {order: {$lte: newPos}}]}, {$inc: {order: -1}}, {multi: true}); Вверх: Slides.update({pres_id: pres_id, _id:$ne:slide_id}, $and: [{order: {$lt: oldPos}},{order: {$gte: newPos}}]}, {$inc: {order: 1}}, {multi: true}); Когда элемент перемещается вниз, порядок элементов выше newPos должен уменьшаться, и нам также не нужно делайте что-нибудь с элементами ниже newPos, то же самое с перемещением элемента вверх. 03.07.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..