Схема и структура MongoDB - PullRequest
1 голос
/ 07 мая 2020

Я только начал изучать mongoDB и mon goose здесь.

Возможно ли использовать значение в качестве ключа в mongoDB? Например, я хотел бы иметь такую ​​структуру:

Коллекция людей:

USA: {
  'John Doe': { phone: '...', somethingElse: '...' },
  'Jane Doe': { phone: '...', somethingElse: '...' },
},
Australia: {
  'John Doe': { phone: '...', somethingElse: '...' },
  'Jane Doe': { phone: '...', somethingElse: '...' },
},
England: {
  'John Doe': { phone: '...', somethingElse: '...' },
  'Jane Doe': { phone: '...', somethingElse: '...' },
}

Я знаю, что это ужасный пример, и я понимаю, что в качестве альтернативы мы можем хранить такие документы, как:

{_id: 1, name: 'John Doe', address: 'USA', phone: '...', ...},
{_id: 2, name: 'John Doe', address: 'Australia', phone: '...', ...},
{_id: 3, name: 'John Doe', address: 'England', phone: '...', ...},

Думаю, я просто пытаюсь понять, возможно ли здесь сохранение value как key. И если это так, как нам определить схему с помощью mon goose?

1 Ответ

1 голос
/ 08 мая 2020

Теоретически вы можете использовать схему, например:

const testSchema = new Schema({
    countries: {
        type: Map,
        of: {
            type: Map,
            of: Object,
        },
    },
});

, используя преимущества Map введите mon goose, тогда вы можете назначить свой динамический c объект в свойство contries.

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

Первая причина в том, что наличие c ключевых имен динамически затрудняет выполнение запросов. Вместо простого .find({name: 'John Doe'}) вам нужно выполнять сложные агрегационные запросы, такие как здесь . В принципе, любой обход, например подсчет людей, фильтрация по телефону и c, будет болезненным с ключами Dynami c.

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

...