Как удалить столбец из дочерней коллекции - PullRequest
13 голосов
/ 14 февраля 2011

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

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

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

Есть идеи, что я делаю не так?

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

Ответы [ 2 ]

13 голосов
/ 14 февраля 2011

Обновление с пустым параметром не работает.Я попробовал это в оболочке монго и моноконсоле.В mongoconsole она выдавала ошибку об обновлении, ожидая, что первый параметр будет массивом или объектом.

Однако вы можете сделать то же самое, используя запрос поиска с существующим $.

Попробуйте:

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

Это сработало для меня.

Имейте в виду, что на основе документов $ exist не использует индекс, поэтому будет медленнее.Я предлагаю добавить параметр, к которому вы можете добавить индекс и запрашивать его при выполнении $ unset.

0 голосов
/ 15 февраля 2011

Похоже, у вас есть несколько проблем здесь.

# 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: Использование RAM

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

Это именно то, что пытается сделать MongoDB.MongoDB использует отображенные в память файлы.MongoDB загрузит все данные в оперативную память и позволит операционной системе управлять проблемами с виртуальной памятью.

Поэтому, когда вы делаете запрос без индексов, вы в основном просите MongoDB пройтись по каждому элементу в коллекции.По сути, это гигантский цикл, работающий со всеми вашими данными, поэтому для этого потребуется загрузка всего с диска.

До сих пор это все нормально.

..Затем сервер падает

Это не нормально.Я выполнил команду обновления этого типа на сотнях миллионов документов без сбоя сервера.Можете ли вы предоставить более подробную информацию по этой проблеме?У вас есть файлы журналов?

Если это так, я бы посоветовал передать ваши ошибки в группы Google, чтобы они могли помочь определить источник сбоя.http://groups.google.com/group/mongodb-user

...