Возвратите главного покупателя по общей стоимости, миллионы документов по двум коллекциям через объединенный поиск.Проблемы с производительностью - PullRequest
0 голосов
/ 26 августа 2018

У меня есть две коллекции: 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

Большое спасибо

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