Добавить поле в ограниченную коллекцию в MongoDB

Я создал ограниченную коллекцию для хранения данных журнала с несколькими полями. Из-за некоторых требований я хотел добавить в эту коллекцию дополнительное поле с именем "createAt".

db.myLogs.update({},{$set: {"createAt":new Date()}})

Это выбрасывает ниже ошибки:

WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
                "code" : 10003,
                "errmsg" : "Cannot change the size of a document in a capped collection: 39 != 57"
        }
})

Как я могу добавить несколько полей в ограниченную коллекцию?

1 ответ

Решение

Простой ответ

Как говорит вам Монгод, вы не можете. Как и документация:

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

Чуть более изощренный ответ

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

Если вам действительно нужно это сделать

  1. Прекратить чтение и запись в ограниченную коллекцию
  2. Скопируйте документы из закрытой коллекции во временную коллекцию.
  3. Изменить документы по мере необходимости во временной коллекции
  4. Оставьте и воссоздайте ограниченную коллекцию
  5. Прочитайте документы из временной коллекции в нужном порядке и вставьте их в воссозданную ограниченную коллекцию.

После того как вы сделали "1", вы можете использовать что-то вроде этого для "2". на оболочке:

var bulk = db.temp.initializeOrderedBulkOp();
var counter = 0;

db.capped.find().forEach(

  function(doc){
    bulk.insert(doc);

    // In case you have a lot of documents in
    // your capped collection, it makes sense
    // to do an intermediate execute
    if( ++counter % 10000 == 0){
      bulk.execute();
      bulk = db.temp.initializeOrderedBulkOp();
    }

  }
);
// execute the remainder
bulk.execute() 

Это должно быть легко адаптируемо для "5".

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