Добавить поле в ограниченную коллекцию в 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". на оболочке:
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".