Как удалить столбец из дочерней коллекции
У меня есть коллекция в MongoDB под названием CrawlUser. Он имеет список CrawlStatuses, который является списком объектов CrawlStatus. CrawlStatus имеет свойство LastErrorMessage, которое я хочу удалить из коллекций.
Я попытался сделать следующее, чтобы удалить его, но он не сработал... Нет сообщения об ошибке, но столбец LastErrorMessage все еще существует.
db.CrawlUser.update( {}, { $unset: { "CrawlStatuses.LastErrorMessage": 1 } }, false, true);
Любые идеи, что я делаю неправильно?
Еще один связанный с этим вопрос, если я делаю команду $unset для столбца в очень большой (миллионы строк) коллекции, mongodb использует весь ram на сервере (как будто он пытается сохранить весь сбор в памяти), то сервер сбой. Есть ли лучший способ удалить столбцы при наличии больших коллекций?
Ответы
Ответ 1
Обновление с пустым параметром не работает. Я попробовал это в оболочке монго и mongoconsole. В mongoconsole он дал ошибку об обновлении, ожидая, что первым параметром будет массив или объект.
Однако вы можете сделать то же самое, используя запрос поиска $exists.
Try:
`db.CrawlUser.update( {CrawlStatuses:{$exists:true}}, { $unset: { "CrawlStatuses.LastErrorMessage": 1 } }, false, true);`
Это сработало для меня.
Имейте в виду, что на основе документов, $exists не использует индекс, поэтому он будет медленнее. Я предлагаю добавить параметр, который можно добавить в индекс и запросить его при выполнении $unset.
Ответ 2
Похоже, у вас есть пара проблем.
# 1: команда $unset
Насколько я вижу, это должно работать нормально. Я получил следующий результат в своем тесте:
MongoDB shell version: 1.6.5
connecting to: test
> db.foo.save( { _id : 1, status : { err : 'blah', y : 1 } } )
> db.foo.save( { _id : 2, status : { err : 'blahblah', y : 5 } } )
> db.foo.find()
{ "_id" : 1, "status" : { "err" : "blah", "y" : 1 } }
{ "_id" : 2, "status" : { "err" : "blahblah", "y" : 5 } }
> db.foo.update( { }, { $unset : { "status.err" : 1 } }, false, true )
> db.foo.find()
{ "_id" : 1, "status" : { "y" : 1 } }
{ "_id" : 2, "status" : { "y" : 5 } }
# 2: Использование ОЗУ
если я делаю команду $unset для столбца в очень большой коллекции, mongodb использует все баран на сервере (как будто он пытается хранить всю коллекцию в памяти)
То, что пытается сделать MongoDB. MongoDB использует файлы с отображением памяти. MongoDB вытащит все данные в ОЗУ и позволит операционной системе управлять проблемами виртуальной памяти.
Итак, когда вы делаете запрос без индексов, вы в основном просите MongoDB пройти через каждый элемент коллекции. Это в основном гигантский цикл, работающий на всех ваших данных, поэтому для этого потребуется загрузить все с диска.
До сих пор это нормально.
... тогда сервер аварийно завершает работу
Это не нормально. Я запустил этот тип команды обновления на сотни миллионов документов без сбоев сервера. Можете ли вы предоставить более подробную информацию об этой проблеме? У вас есть файлы журналов?
Если да, я бы предложил взять ваши ошибки в группы Google, чтобы они могли помочь идентифицировать источник сбоя.
http://groups.google.com/group/mongodb-user