Возвращает JSON с данными из MongoDB

#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 , чтобы сбросить результирующий набор.