Два поля «id» в одной коллекции MongoDB с Rails 3?

#ruby-on-rails-3 #mongodb #mongoid

#ruby-on-rails-3 #mongodb #mongoid

Вопрос:

У меня есть проект Rails 3.0.9, использующий последнюю версию MongoDB и Mongoid 2.2.

Я импортировал CSV с полем «id» в коллекцию MongoDB с именем College, в результате чего получилась такая коллекция:

 { "_id" : ObjectID("abc123"), "id" : ######, ... }
  

Наблюдения:

  1. Результатом действия show является URL-адрес, использующий ObjectId
  2. Отображение ‘college.id ‘ в index.html.erb отображается идентификатор объекта

Вопросы:

  1. Как мне использовать исходное поле «id» в качестве параметра
  2. Зарезервировано ли «id» MongoDB, что означает, что мне нужно переименовать поле «id» в коллекции колледжа (возможно, в «code») — если да, то как?

Спасибо!

Обновить

Ответ:

 db.colleges.update( { "name" : { $exists : true } } , { $rename : { "id" : "code" } }, false, true )
  

Я использовал «name», поскольку это было поле, которое я мог проверить на наличие.

Ответ №1:

_id является зарезервированным и обязательным свойством в MongoDB — я думаю, что mongoid сопоставляет id с _id, поскольку это имеет смысл. Может быть способ получить доступ к свойству id через mongoid, но я думаю, вам гораздо лучше переименовать столбец id во что-то другое, чтобы избежать путаницы в будущем.

 { $rename : { old_field_name : new_field_name } }
  

переименует имя поля в документе (mongo 1.7.2 ).

итак

 db.college.update({ "_id" : { $exists : true }}, { $rename : { 'id' : 'code' } }, false, true);
  

следует обновить каждую запись в этой коллекции и переименовать поле id в code.

(очевидно, проверьте это перед запуском любых важных данных)

Комментарии:

1. Команде update потребовалась дополнительная закрывающая скобка } , но даже при этом консоль mongo возвращает синтаксическую ошибку: Invalid property id (shell):1

2. Может быть, это как-то связано с upsert и несколькими частями db.collection.update( criteria, objNew, upsert, multi ) ? Я не знаю. Я не знаю, что эти части функционально делают.

3. Имя коллекции было множественным db.colleges.update( { "name" : { $exists : true } } , { $rename : { "id" : "code" } }, false, true ); , и я использовал «name», поскольку это было еще одно поле, которое я мог проверить на наличие, но в принципе — вы были правы! Большое спасибо!