代码之家  ›  专栏  ›  技术社区  ›  Michael Mao

RubyMongoDB-如何根据日期时间对记录进行排序?

  •  1
  • Michael Mao  · 技术社区  · 14 年前

    我一定是用了错误的方法:打印出来的记录是无序的,即使它们一次插入一个数据库。代码如下:

    get '/' do
      db = Mongo::Connection.new("localhost", 27017).db("testdb")
      @notes = db.collection('notes')
      @notelist = Set.new()
      @notes.find().each{|record| @notelist.add(record)}
      erb :list
    end
    
    post '/addnote' do
      db = Mongo::Connection.new("localhost", 27017).db("testdb")
      col1 = db.collection('notes')
      col1.insert(
      {
        "guestname" => "#{params[:post][:guestname]}",
        "note"      => "#{params[:post][:note]}",
        "datetime"  => Time.now.strftime("%I:%M %p %d-%b-%Y")
      })
    redirect '/'
    end
    

    下面是erb模板:

    <p><%= @notelist.size() %> notes entered by guests:</p>
    <ul>
      <% @notelist.each do |record| %>
        <li><font color='blue'><%= record['guestname'].to_s() + 
        "</font> at <i>" + record['datetime'].to_s() +"</i> wrote: " + 
        record['note'].to_s() %></li>
      <% end %>
    </ul>
    

    我试图按日期时间的顺序从数据库中取出所有记录,我如何才能做到这一点?

    提前多谢。

    更新信息:

    第二种想法是,我将数据类型从time更改为unix epoch,因此对它们进行排序会更好、更容易。

    1 回复  |  直到 14 年前
        1
  •  5
  •   Kyle Banker    14 年前

    以下是一些注意事项:

    通过添加排序,可以按顺序获取记录:

    @notes.find({}, :sort => 'datetime')
    

    在输入模板之前不需要迭代。“find”方法返回一个光标,该光标本身是不可更改的。所以

    @notelist = Set.new()
    @notes.find().each{|record| @notelist.add(record)}
    

    应该读

    @notelist = @notes.find({}, :sort => 'datetime')
    

    在每个请求上建立一个新的连接是非常低效的。您应该在配置块上建立连接,并在其中缓存数据库:

    configure do
      DB = Mongo::Connection.new.db("testdb")
    end
    

    然后在请求中使用对数据库的引用。