Как разбить массив объектов на подмассивы в зависимости от значения поля в Rails и Mongodb - PullRequest
0 голосов
/ 20 сентября 2019

Я хочу получить несколько массивов объектов, агрегированных по месяцам (и годам) в значении их свойства.

У меня есть класс Request следующим образом:

class Request  
  include Mongoid::Document  
  include MongoidDocument::Updated  

  field :name, type: String  
  field :start_date, type: DateTime  
#...
end

И я хочурезультирующий массив из нескольких хэшей с

{month: m_value, year: y_value, request: requests_with_m_value_as_month_and_y_value_as_year_in_start_date_field}

в качестве элемента массива

Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 20 сентября 2019

Вы можете использовать Агрегационный конвейер , чтобы получить данные в правильной форме из MongoDB:

db.requests.aggregate([
  {
    $group: {
      _id: {
        year: { 
          $year: "$start_date"
        },

        month: { 
          $month: "$start_date"
        }
      },

      requests: {
        $push: "$$ROOT"
      }
    }
  },

  {
    $project: {
      _id: 0,
      year: "$_id.year",
      month: "$_id.month",
      requests: "$requests"
    }
  }
])

Очевидно, это использует только REPL, и вам придется его перевестик DSL предоставлен Mongoid.Исходя из того, что я смог найти, должна быть возможность просто получить базовую коллекцию и вызвать для нее aggregate:

Request.collection.aggregate([...])

Теперь вам просто нужно взять запрос и преобразовать его во что-то, что Mongoid примет,Я думаю, что вам просто нужно добавить кучу кавычек вокруг ключей объекта, но я не настроил среду, чтобы попробовать это сам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...