Запрос Mongo для удаления \n из всех полей _index?

Я использую mongomapper с моим приложением rails. Это ошибка всякий раз, когда запись монго имеет «\ n» в «_index» или любом из полей.

SyntaxError: (eval):1: синтаксическая ошибка, неожиданное '\n', ожидание tCOLON2 или '.' (eval):3: синтаксическая ошибка, неожиданное ключевое слово_end, ожидание $end

Причина, по которой поля имеют «\n», заключается в том, что данные были очищены и не очищены должным образом.

Например, это одно из проблемных полей:

ruby-1.9.2-p180 :004 > Activity.where(:_index => /\n/i).first["_index"]
 => "Heating Building\n\nAir Emissions" 

Чтобы исправить это в ruby ​​​​(mongoid), это будет в основном:

Activity.where(:_index => /\n/i).each do |a|
  a.update_attribute(:_index, a[:_index].gsub("\n", " "))
end

Есть ли способ исправить это, просто используя запрос монго?

Запрос монго должен будет пройти через каждую строку монго и заменить «\n» на «» в поле _index.

Причина, по которой я спрашиваю, заключается в том, что у нас нет времени переместить наше приложение с mongomapper на mongoid (монгоид знает, как обрабатывать \n без ошибок).


person dMix    schedule 17.10.2011    source источник
comment
Написанный вами код должен работать и в MongoMapper, используя find_each и стандартное изменение/сохранение вместо update_attribute. Однако обратите внимание, что если документы становятся больше, когда вы их сохраняете, вы можете вернуть некоторые документы дважды mongodb.org/display/DOCS/   -  person Brian Hempel    schedule 18.10.2011


Ответы (2)


Вы искали это:

   db.activities.find({_index:/\n/}).forEach(function(obj) { obj._index = obj._index.replace(/\n/g, ' '); db.activities.save(obj);});
person Pandaamonium    schedule 15.12.2011

db.eval(), вероятно, то, что вы ищете.

http://www.mongodb.org/display/DOCS/Server-side+Code+Execution#Server-sideCodeExecution-Using%7B%7Bdb.eval%28%29%7D%7D

person Brian Hempel    schedule 18.10.2011