1

MongoDB中的语法:

db.orders.aggregate(
   {$unwind: "$lines"},
   {$group : 
             {_id: {sku: "$lines.sku", desc: "$lines.description"}, 
             qty : {$sum : 1}}},{ $sort : { qty : -1}}
                   )

我想在 Rails 上显示上述查询的结果。

我将 Mongoid 与 Rails 4 和我的 Gemfile 一起使用:

gem 'mongoid', github: 'mongoid/mongoid'

据我了解,编写上述查询的唯一方法是为轻便摩托车驱动程序安装 gem。所以,我的第一个问题是应该如何在 Gemfile for Rails 4 和 Ruby 2.0 中声明该行?

我假设 moped 中的查询如下所示:

Order.collection.aggregate(
    {"$unwind" => "$lines"},
    {"$group" => {"_id" => {"sku" => "$lines.sku", desc => "$lines.description"}, 
    qty => {"$sum" => 1}}},
    { "$sort" => { "qty" => -1}})

我想通过单击索引页面上的按钮而不传递参数来显示此查询的结果。第二个问题是我不知道如何更改控制器和索引视图页面以放置一个将调用此查询的按钮。


更新

控制器的索引方法部分如下:

  def index
    @orders = if params[:search]
      Order.search(params[:search]).queryable.asc(:_id).paginate(:page => params[:page], :per_page => 20)
    elsif params[:search_from] && params[:search_to]
      Order.search_date(params[:search_from], params[:search_to]).queryable.asc(:_id).paginate(:page => params[:page], :per_page => 20)
    else
      Order.shipping_today(Date.today, Date.today).queryable.asc(:_id).paginate(:page => params[:page], :per_page => 20)
    end

index.html.erb:

<h1>Date: <%= Date.today %></h1>

<%= form_tag orders_path, :method => 'get' do %>
<p>Order date range:<br>  
    <%= text_field_tag :search_from, params[:search_from] %> - <%= text_field_tag :search_to, params[:search_to] %>
    <%= submit_tag "Search", :name => nil %>
</p>
<% end %>

<%= form_tag orders_path, :method => 'get' do %>
<p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
    <%= link_to "Reset", orders_path %>
</p>
<% end %>

<%= form_tag orders_path, :method => 'get' do %>
<p>
    <%= submit_tag "Statistics", :name => nil %>
</p>
<% end %>

<div class="digg_pagination">
    <div class="page_info">
      <%= page_entries_info @orders %>
    </div>
    <%= will_paginate @orders, :container => false %>
  </div>

  <br />

<table border = 1 >
  <thead>
    <tr>
      <th>Shipping date</th>
      <th>Order #</th>
      <th>Ship to name</th>
      <th>Tracking #</th>
      <th>Shipped</th>
      <th>Action</th>
      <th></th>
    </tr>
  </thead>

  <tbody>
  <% @orders.each do |order| %>
    <tr>
      <td><%= order.shipping_date %></td>
      <td><%= link_to order.order_number, order_path(order) %></td>
      <td><%= order.ship_to_fname %></td>
      <td><%= order.track_num %></td>
      <td><%= order.ship_date %></td>
      <td><%= link_to 'Edit', edit_order_path(order) %></td>
      <td><%= link_to 'New', new_order_path(order) %></td>
      <td><%= link_to 'Destroy', order, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>
</tbody>
</table>

<br />

<%= link_to 'New Order', new_order_path %>
4

1 回答 1

2

您编写的 Gemfile 中的行gem 'mongoid', github: 'mongoid/mongoid'应该足以使该查询正常工作。

aggregate命令之后,您将获得一个包含聚合结果的数组。您可以将其分配给控制器中的实例变量并在视图中对其进行迭代。

例如:

# LinesController
def index
  @lines = Order.collection.aggregate(
    {"$unwind" => "$lines"},
    {"$group" => {"_id" => {"sku" => "$lines.sku", desc => "$lines.description"}, 
    qty => {"$sum" => 1}}},
    { "$sort" => { "qty" => -1}})
end

# lines/index.html.erb
<ul>
  <% @lines.each do |line| %>
    <li>
      <b><%= line['_id']['sku'] %></b>
      <%= line['qty'] %>
    </li>
  <% end %>
</ul>
于 2013-07-08T10:46:53.257 回答