Коллекция Meteor mongo touch

Я хотел бы знать, могу ли я выполнить такую ​​операцию, как «прикосновение» для документов mongo в Meteor.

Я использую пакет aldeed:collection2 для проверки схемы базы данных. Недавно я добавил несколько новых полей со значениями по умолчанию, и теперь мне нужно выполнить миграцию моей базы данных.

Вместо того, чтобы писать отдельные миграции для каждого нового поля, я планирую прикоснуться ко всем документам, чтобы значение по умолчанию, определенное с помощью aldeed:simple-schema, было применено к документам.

Есть сенсорная операция? Как я могу продолжить?


person Sung Cho    schedule 31.08.2015    source источник
comment
Сам MongoDB не имеет схемы, поэтому все ваши определения применяются к вашему клиентскому коду, а не к серверу. Таким образом, единственный способ применить поля по умолчанию - это либо 1. Прочитать все по одному, создать экземпляр объекта, сохранить экземпляр объекта с изменениями. 2. Поймите, что это неэффективно, и напишите код миграции вручную с оптимизированными операциями. В вашем вопросе нет ничего, что могло бы дать представление о том, что это за изменения на самом деле. Некоторые изменения могут быть простыми операциями, а некоторые могут потребовать некоторой массовой итерации.   -  person Blakes Seven    schedule 31.08.2015
comment
@BlakesSeven В этом есть смысл. Пожалуйста, опубликуйте это как ответ.   -  person Sung Cho    schedule 01.09.2015


Ответы (1)


Просто переберите каждый документ в вашей коллекции, validate, и обновите. Это фактически "прикосновение" к каждому документу. Производительность не должна беспокоить вас, поскольку это единовременная миграция. Шаги следующие:

  1. Подтвердите документ с помощью SimpleSchema validate(doc), который автоматически применяет defaultValues к объекту документа
  2. collection.update(doc)

Вот пример реализации.

collection.find().forEach(function(doc) {
  MySchema.namedContext("myContext").validate(doc);
  collection.update({_id: doc._id}, doc);
});

Это должно сработать!


Примечание. Чтобы воспользоваться преимуществами SimpleSchema, вам, очевидно, придется запускать этот код из контекста Meteor (а не mongo), что может быть непросто в производственной среде. Таким образом, вы можете написать эту миграцию как метод на стороне сервера, который вы вызываете из клиента (убедитесь, что он защищен) или из оболочки Meteor, если, в зависимости от вашей реализации, он у вас есть.

person tyleha    schedule 03.09.2015