Подтвердить что ты не робот

Как удалить столбец из дочерней коллекции

У меня есть коллекция в MongoDB под названием CrawlUser. Он имеет список CrawlStatuses, который является списком объектов CrawlStatus. CrawlStatus имеет свойство LastErrorMessage, которое я хочу удалить из коллекций.

Я попытался сделать следующее, чтобы удалить его, но он не сработал... Нет сообщения об ошибке, но столбец LastErrorMessage все еще существует.

db.CrawlUser.update( {}, { $unset: { "CrawlStatuses.LastErrorMessage": 1 } }, false, true);

Любые идеи, что я делаю неправильно?

Еще один связанный с этим вопрос, если я делаю команду $unset для столбца в очень большой (миллионы строк) коллекции, mongodb использует весь ram на сервере (как будто он пытается сохранить весь сбор в памяти), то сервер сбой. Есть ли лучший способ удалить столбцы при наличии больших коллекций?

4b9b3361

Ответ 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