Можно ли хранить несколько типов объектов в одной коллекции mongodb?

использование ориентированной на документы базы данных mongodb и Morphia Object Document Mapper (ODM)

Допустим, у нас есть 3 разных класса; Object, Category а также Action,
Все эти объекты хранятся в коллекциях; объекты, категории и действия.

Category а также Action ссылки на Object

@Entity("objects")
public class Object {

    @Id
    @Property("id")
    private ObjectId id;

    @Reference
    private Category category;
    private Action action;
    ...
}

@Entity("categories")
public class Category {

    @Id
    public String categoryTLA;
    public String categoryName;
    ...
}

@Entity("actions")
public class Action implements BaseEntity {

    @Id
    public String action;
    public int accesLevel;
    ...
}

Документы с текущей реализацией хранятся как:

  • Монго (Сервер / местоположение)
    • магазин (база данных)
      • объекты (коллекция)
        • объект (документ)
        • объект
        • объект
      • категории
        • Категория
        • Категория
        • Категория
      • действия
        • действие
        • действие
        • действие

Можно ли хранить 2 разных объекта, в этом случае Category а также Actionв одной коллекции, как показано в следующем примере? Оба со своей идентификацией!

  • Монго
    • хранить
      • объекты
        • объект
        • объект
        • объект
      • настройки
        • Категория
        • Категория
        • Категория
        • действие
        • действие
        • действие

2 ответа

Решение

Безусловно, можно хранить несколько типов документов в одной коллекции. Фактически, это одна из сильных сторон ориентированной на документы базы данных, такой как Mongo. Однако вы можете не захотеть объединять их, не рассматривая некоторые проблемы (положительные и отрицательные):

  1. Вы не можете выполнять перекрестный сбор или документирование SQL-подобных JOIN. Таким образом, наличие документов в одной или нескольких коллекциях не изменит это поведение.
  2. Вы можете использовать агрегацию только в одной коллекции, поэтому вам будет удобнее выполнять некоторые запросы в стиле агрегации, если у коллекции несколько типов документов, а не разбито по коллекциям (и структура агрегации, и Map-Reduce работают только с одной коллекцией вовремя).
  3. Чтобы десериализовать документ в объект в Morphia, вам нужно знать, какой тип представляет данный документ. Возможно, вам потребуется добавить в документ поле с указанием типа, если только нет других способов, которые могут безопасно представлять тип документа, чтобы процесс десериализации работал правильно. Action не может быть Category например. Если вы сделали эквивалент FindAll и было несколько типов документов, если десериализатор не может оценить структуру документа до начала десериализации, ваш код может работать не так, как хотелось бы.
  4. Вполне вероятно, что вам нужно будет индексировать различные свойства ваших документов / объектов. Если вы индексируете на основе типов документов (скажем, Action имеет индекс, который является unqiue из Categoryвсе документы, вставленные в коллекцию, содержащую оба, будут проходить через индексатор для всех индексов, определенных в коллекции. Это может повлиять на производительность в зависимости от характера индексов. Это означает, что все документы в коллекции будут проиндексированы независимо от того, имеет ли индекс смысл. Это часто является веской причиной не объединять несколько типов документов, которые не имеют общих черт индексации.

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

Да. но, вероятно, вам нужно добавить поле "documentType" в любой документ, чтобы различать документы

Другие вопросы по тегам