В Интернете полно ресурсов для работы с массивами, но зачастую объекты более естественны для данных и, по-видимому, более эффективны.
Я хочу хранить объекты с ключом в именах динамических полей следующим образом:
project['en-US'] = { 'nav-back': 'Go back', ... }
project['pt-BR'] = { 'nav-back': 'Volte', ... }
Похоже, что это будет более эффективно, чем сохранение массива всех языков и его фильтрация, чтобы получить все языковые записи для данного языка.
Мой вопрос: как я могу вставить пару ключ-значение в объект с динамическим именем, используя mongoose? И должен ли объект существовать или я могу его создать, если он не в одной операции?
Я попробовал это:
await Project.update(
{ _id: projectId },
{
$set: {
['${language}.${key}']: value,
},
});
Но не удачи, независимо от того, есть ли у меня пустой объект для начала или нет: { ok: 0, n: 0, nModified: 0 }
.
Бонус: Должен ли я индексировать эти объекты и как? (Я хочу обновить отдельные элементы)
Спасибо!
Я решил это, используя исходный фрагмент кода без изменений, но добавив { strict: false }
к схеме:
const projectSchema = new Schema({ ...schema... }, { strict: false });
В mongoose
schema
- это все. Он описывает данные, которые вы собираетесь читать/хранить из базы данных. Если вы хотите добавить динамически новый ключ в схеме, это будет сложно.
В этом конкретном случае я бы рекомендовал использовать собственный mongodb-native-driver
который является более разрешительным в отношении манипулирования данными. Таким образом, вы можете читать данные в определенном формате и динамически добавлять в него свое поле.
Чтобы возобновить мою мысль, как должно произойти ваше динамическое изменение:
mongodb-native-driver
для вставки нового ключа в данные базы данных Не забывайте динамически обновлять свою mongoose model
или вы не будете читать новый ключ при следующей find
.