У меня есть две коллекции: orders_A и orders_B (заказы через Интернет и приложения) с одинаковой структурой:
orders_A:
{"_id": 100001,
"customer_id": 200001,
"order_value": 10,
"record_id": 11111,
"related_product": "No",
"Date_of_order": "12/07/2018"},
{"_id": 100002,
"customer_id": 200001,
"order_value": 15,
"record_id": 11112,
"related_product": "No",
"Date_of_order": "13/07/2018"}
orders_B:
{"_id": 102201,
"customer_id": 200001,
"order_value": 5,
"record_id": 22222,
"related_product": "No",
"Date_of_order": "09/07/2018"},
{"_id": 102202,
"customer_id": 200001,
"order_value": 5,
"record_id": 22223,
"related_product": "No",
"Date_of_order": "10/07/2018"}
У меня есть запрос, который я использую, чтобы получить общую сумму платежей для одного клиента:
db.orders_A.aggregate([
{$match: {customer_id: 346085}},
{$project:
{customer_id:1,
Record_ID:1,
order_value:1}},
{$group:
{_id: “$customer_id”,
value_of_orders_a: {
$sum: “$order_value”}}},
{$lookup:
{from: “orders_B”,
localField: “_id”,
foreignField: “customer_id”,
as: “orders_B”}},
{$project:
{total_value:
{$add: [“$value_of_orders_a”,
{$sum: “$orders_B.order_value”}]
}}}
] )
Вывод: {«_id»: 346035, total_value »: 15980.85}
Это можетсделать за 200 мс - достаточно для меня
Проблема возникает, когда я хочу ответить на вопрос типа «Какой customer_id имеет наибольшую общую сумму заказа?»
Orders_A и Orders_B могутдлиной в миллионы документов
Выполнение запроса для получения всего 5 заказов клиентов занимает 2 минуты, когда я не использую $ match для идентификатора клиента
Я создал индексы для customer_id в обоих Orders_Aи Orders_B
В основном мне нужна помощь в выполнении этого:
db.orders_A.aggregate ([
{$project:
{customer_id:1,
Record_ID:1,
order_value:1}},
{$group:
{_id: “$customer_id”,
value_of_orders_a: {
$sum: “$order_value”}}},
{$lookup:
{from: “orders_B”,
localField: “_id”,
foreignField: “customer_id”,
as: “orders_B”}},
{$project:
{
_id : 1,
total_value:
{$add: [“$value_of_orders_a”,
{$sum: “$orders_B.order_value”}]
}}},
{$sort: {total_value: 1}},
{$limit : 1}
] )
Как я могу выполнить этот запрос?
Желаемый результат:
{«_id»: 346036, total_value »: 1200000,00}
Версия MongoDB: 4.0.1
Большое спасибо