MongoDB получает полный документ после матча, группы и сортировки - PullRequest
1 голос
/ 23 марта 2019

Заказать:

{
  order_id: 1,
  order_time: ISODate(...),
  customer_id: 456,
  products: [
    {
      product_id: 1,
      product_name: "Pencil"
    },
    {
      product_id: 2,
      product_name: "Scissors"
    },
    {
      product_id: 3,
      product_name: "Tape"
    }
  ]
}

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

То есть, когда существует «products.product_name», которое равно «Scissors», сгруппированный по customer_id, дайте мне полный документ, где «order_time» является «max» для этой группы.

Чтобы найти документы, я мог бы сделать как find({ 'products.product_name' : "Scissors" }), но тогда я получаю весь заказ с помощью ножниц, я хочу только самые последние.

Итак, я смотрю на агрегацию ... стадия агрегации Монго "$ group", кажется, требует, чтобы вы выполняли какое-то фактическое агрегирование внутри, например sum или max или что-то еще. Я предполагаю, что здесь есть какая-то комбинация $match, $group и $sort, но я не могу заставить ее работать.

Что-то близкое:

db.storcap.aggregate(
[
{
  $match: { 'products.product_name' : "Scissors" }
},
{
  $sort: { created_at:-1 }
},
{
  $group: {
    _id: "$customer_id", 
  }
}]
)

Но это не возвращает полный документ, и я не уверен, что он правильно выполняет сортировку и группировку.

1 Ответ

1 голос
/ 23 марта 2019

Вы можете использовать оператор $ first , чтобы получить самый последний порядок (упорядоченный desc), и специальную переменную $$ROOT, чтобы получить весь объект в конечном результате:

db.storcap.aggregate([
    {
        $match: { 'products.product_name' : "Scissors" }
    },
    {
        $sort: { created_at:-1 }
    },
    {
        $group: {
            _id: "$customer_id",
            lastOrder: { $first: "$$ROOT" }
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...