MongoDB $ делят на совокупный объем производства - PullRequest
1 голос
/ 17 октября 2019

Есть ли возможность вычислить математическую операцию на уже агрегированных вычисляемых полях?

У меня есть что-то вроде этого:

([
        {
                "$unwind" : {
                        "path" : "$users"
                }
        },
        {
                "$match" : {
                        "users.r" : {
                                "$exists" : true
                        }
                }
        },
        {
                "$group" : {
                        "_id" : "$users.r",
                        "count" : {
                                "$sum" : 1
                        }
                }
        },
])

, который дает вывод как:

{ "_id" : "A", "count" : 7 }
{ "_id" : "B", "count" : 49 }

Теперь я хочу разделить 7 на 49 или наоборот.

Есть ли возможность сделать это? Я пробовал $ project и $ split, но безуспешно.

Любая помощь будет очень признательна.

Спасибо,

1 Ответ

0 голосов
/ 19 октября 2019

По вашему вопросу похоже, что вы предполагаете, что результат подсчета равен только 2. В этом случае я могу предположить, что users.r может иметь только 2 значения (кроме нуля).

Самое простое, что я предлагаю, - это выполнить арифметику с помощью javascript (если вы используете его в консоли mongo) илив случае использования его в программе, используйте язык, который вы используете для доступа к монго), например,

var results = db.collection.aggregate([theAggregatePipelineQuery]).toArray();
print(results[0].count/results[1].count);

РЕДАКТИРОВАТЬ: Я делюсь альтернативой вышеподход, потому что OP прокомментировал ограничение не использовать код JavaScript и необходимость делать это только с помощью запроса. Вот оно

([
       { /**your existing aggregation stages that results in two rows as described in the question with a count field **/ },
       { $group: {"_id": 1, firstCount: {$first: "$count"}, lastCount: {$last: "$count"} 
       },
       { $project: { finalResult: { $divide: ['$firstCount','$lastCount']} } }
])

//The returned document has your answer under `finalResult` field
...