2015-01-14 10 views
3

В моем приложении Rails я использую MongoID с рекой Elasticsearch для текстового поиска.Rails Mongoid `pluck` эквивалент?

Для @devices_with_config = ConfigTextSearch.search params[:device_id] Я хочу извлечь только поля device_id для соответствующих записей в запросе. В mongoID 3.1.0 я мог бы просто использовать Band.all.pluck(:name). Но, к сожалению, я застрял с 3.0.23.

Я вижу, что существует аналогичное выражение мопеда collections[:bands].find.select(name: 1) ... но я новичок в рельсах и не могу понять, как использовать выражение мопеда в контроллере или модели.

Любые идеи о том, как я могу извлечь поле 'device_id' в матчах с MongoId?

ответ

1

Вы можете ухватить коллекции Moped как это

Band.collection.find.select(name: 1) 
+0

Спасибо. С помощью 'ConfigTextSearch.search (« foo ») find.select (device_id: 1)' I get' ArgumentError: неправильное количество аргументов (1 для 0) из (pry): 46: in 'select'' – dman

+1

' ConfigTextSearch. search ("foo") 'для меня не похож на мопед. –

+0

Использует 'elasticsearch-rails', который наследует методы от MongoId. – dman

0

Нашел .... от того, что я могу сказать, что это не на документы Mongoid .....

sue = bob.results.map { |r| r._source.device_id }

1

Похоже, что вы на самом деле не строите критерий Mongoid с этим вызовом, но я не смотрел в elasticsearch рельсы, так что я не могу быть уверен на 100%.

Если вы совершенно не в состоянии обновить до 3.1.0 вы должны быть в состоянии просто обезьяна патч эту функциональность в

module Mongoid 
    class Criteria 
    # select specific fields from collection based on current scope, returned as a hash 
    def pluck(*fields) 
     raise ArgumentError, 'Call this with at least one field' if fields.empty? 

     collection.find(self.selector).select(Hash[fields.map { |field| [field, 1] }]).to_a 
    end 
    end 
end 

После добавления приведенного выше кода вы должны быть в состоянии сделать следующее:.

Band.where(name: 'awesome').pluck(:id, :device_id) 
1

эквивалентной методы срывать, определенную в Mongoid является:

plucked_array = User.where. (: имя => 'XYZ') карты (&: field_to_be_pluc КЕД)

Где field_to_be_plucked это имя поля, значения которых должны быть вырвано в массиве.

+0

Это загружает весь документ (и встроенные документы) из mongodb, который довольно неэффективен, более эффективная реализация, если вы вынуждены использовать ' map' будет: 'User.where (name: 'xyz'). only (: email).map (&: email) ', который будет загружать только одно поле, на которое вы смотрите :) – Jay

+0

Согласен! :) Спасибо. –

0

Что я использовал для тех же целей, с Mongoid 3.0:

Band.all.distinct(:name) 

Внимание: значение только тогда, когда все имена различны (если вы хотите, чтобы удалить дубликаты).

+0

Это действительно не отвечает на вопрос. –

+0

Я не согласен. Это решение работает (с ограничением, которое я дал в качестве предупреждения). На мой взгляд, это кажется предпочтительным по сравнению с решением, где строки повторяются в памяти (например, с использованием map()). – Brilnius

 Смежные вопросы

  • Нет связанных вопросов^_^