Использование запроса агрегации для получения списка пользователей с общим количеством транзакций и деталями транзакции в виде встроенного документа - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь получить список пользователей с общим количеством транзакций, и каждый пользователь должен иметь последние детали транзакции в виде внедренного объекта, использующего агрегатные конвейеры MongoDB для получения результатов в GET API.

У меня есть следующая схема базы данных:

Пользователь : _id, имя, телефон, адрес

Продукт : _id, name, unit_price, описание

Транзакция : _id, дата, product_id (ссылка на продукт), user_id (ссылка на пользователя), количество, total_price


Ожидаемый ответ JSON

[
    {
        name:"",
        phone:"",
        address:"",
        total_transaction:
        latest_transaction_detail: {
            product_id:
            quantity:
            total_price:                                                        
        }
    },
    {
        name:"",
        phone:"",
        address:"",
        total_transaction:
        latest_transaction_detail: {
            product_id:
            quantity:
            total_price:                                                        
        }
    }
]

Какгенерировать агрегированный запрос для возврата вышеупомянутого?

1 Ответ

0 голосов
/ 03 октября 2018

Этого можно добиться, выполнив запрос агрегации.

  • Этап поиска объединит вашу коллекцию пользователей с вашей коллекцией транзакций (нет необходимости присоединять продукт к ожидаемому результату).Его конвейер разделен на $ facet для получения результата подсчета и самой последней транзакции для этого пользователя

  • Этап проекта преобразует ваши данные и извлекает элементы массива в документы.

Вот такой запрос:

db.User.aggregate(
[
    {
        $lookup: 
         {
            from: "Transaction",
           let: { userId: "$_id" },
            pipeline: [ 
            {$facet:
              {count:[{$match:{$expr:{$eq:["$$userId","$user_id"]}}}, {$count:"total_transaction"}],
                latest:[
                {$match:{$expr:{$eq:["$$userId","$user_id"]}}},
                {$sort:{date:-1}},
                {$limit:1}]
            } }],
            as: "transactions"
         }
    },
    {
        $project: {
          last_name:1,
          phone:1,
          address:1,
            total_transaction : {
              $let:{
                vars:{
                  count:{
                    $arrayElemAt:["$transactions.count",0]
                    }
                  },
                in:{
                  $arrayElemAt:["$$count.total_transaction",0]
                  }
                }
              },
              latest_transaction : {
              $let:{
                vars:{
                  latest:{
                    $arrayElemAt:["$transactions.latest",0]
                    }
                  },
                in:{
                  $arrayElemAt:["$$latest",0]
                  }
                }


              },    
            }
        },
    ]
);
...