#ruby-on-rails-3 #mongodb #mongodb-ruby
#ruby-on-rails-3 #mongodb #mongodb-ruby
Вопрос:
Я извлекаю данные из MongoDB следующим образом:
@bs = coll2.find("date" => {"$gte" => initial_date, "$lte" => Time.now.utc})
Это работает нормально, но когда я визуализирую @bs, он отправляет пустой.
render :json => @bs
Если я выполняю @bs.each и отображаю каждый из них в формате json, это работает, однако я хочу отправить весь @bs.
Спасибо
Ответ №1:
По умолчанию #find
возвращает объект Mongo::Cursor, а не фактические результаты. Вы захотите сначала преобразовать курсор ( @bs
) в массив с результатами в нем, а затем отобразить это как json.
render :json => @bs.to_a.to_json
Обратите внимание, что, поскольку это курсор, как только вы либо вернете результаты, либо начнете перебирать их, to_a
вызов вернет не все результаты. Вам нужно будет вызвать rewind!
, чтобы сбросить результирующий набор:
> @bs.to_a
# => [{"_id" => BSON::ObjectID.....]
> @bs.to_a
# => []
> @bs.rewind!
# => true
> @bs.to_a
# => [{"_id" => BSON::ObjectID.....]
Комментарии:
1. Спасибо, это имеет смысл. Как мне преобразовать курсор в массив? Есть ли простой способ сделать это?
2.
@bs.to_a
Часть моего примера делает это за вас. Затем вы вызываетеto_json
массив, чтобы получить данные в формате JSON.3. Я все еще получаю [], но @bs возвращает результаты.
4. Убедитесь, что вы ничего не делаете с
@bs
передto_a
вызовом (т. е.to_a
вызов должен быть первым, что вы делаете с@bs
после выполнения вашегоfind
запроса). Поскольку это курсор, выполнение чего-то вроде@bs.each...
приведет к тому, что он будет находиться в конце результирующего набора. Поэтому, когда вы затем делаете@bs.to_a
, это возвращает пустой массив.5. В качестве альтернативы, вы можете вызвать
@bs.rewind!
передto_a
, чтобы сбросить результирующий набор.