Этап $ match не дает никакого вывода в агрегации MongoDB - PullRequest
0 голосов
/ 27 декабря 2018

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

В конвейере агрегации я не получаю параметр avg_pmnt, доступный для этапа $match (следующий этап)

Для следующего кода

db.payments.aggregate([
    {$group: {
        "_id":1, 
        "avg_pmnt": {$avg: "$AMOUNT"}, 
        "AMNT": {$push: "$AMOUNT"}
    } },
    {$unwind: "$AMNT"},
    {$project: {avg_pmnt: "$avg_pmnt", AMNT: "$AMNT"}},
])

Я получаю следующий вывод:

{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 14191 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 32642 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 33348 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 45864 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 82261 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 7565 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 44895 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 19502 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 47924 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 49524 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 50219 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 1491 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 17876 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 34638 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 101245 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 85411 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 11044 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 83598 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 6067 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 14571 }

Тип "it" для более

Но я хочучтобы отфильтровать их

Итак, я попробовал это:

db.payments.aggregate([
    {$group: {
        "_id":1, 
        "avg_pmnt": {$avg: "$AMOUNT"}, 
        "AMNT": {$push: "$AMOUNT"}
    } },
    {$unwind: "$AMNT"},
    {$project: {avg_pmnt: "$avg_pmnt", AMNT: "$AMNT"}},
    {$match: {AMNT: {$gt: "$avg_pmnt"} }}
])

Для которого я не получаю никаких документов (пустой набор).

Я также пытался

db.payments.aggregate([
    {$group: {
        "_id":1, 
        "avg_pmnt": {$avg: "$AMOUNT"}, 
        "AMNT": {$push: "$AMOUNT"}
    } },
    {$unwind: "$AMNT"},
    {$project: {avg_pmnt: "$avg_pmnt", AMNT: "$AMNT"}},
    {$match: {AMNT: {$gt: 1} }}
])

, для которого я получаю все документы, поскольку условие удовлетворяет каждому документу.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

вы также можете использовать $redact для сравнения в тех же полях документа и фильтрации документов

db.payments.aggregate([ 
    {$group: { "_id":1, "avg_pmnt": {$avg: "$AMOUNT"}, "AMNT": {$push: "$AMOUNT"} } }, 
    {$unwind: "$AMNT"}, 
    {$project: {avg_pmnt: "$avg_pmnt", AMNT: "$AMNT"}}, 
    {$redact :{$cond : [{$gt: ["$AMNT", "$avg_pmnt" ]},"$$DESCEND","$$PRUNE"]}}
])
0 голосов
/ 27 декабря 2018

Вы должны использовать $ expr , поскольку вы пытаетесь сравнить два поля внутри $match stage

db.payments.aggregate([ 
    {$group: { "_id":1, "avg_pmnt": {$avg: "$AMOUNT"}, "AMNT": {$push: "$AMOUNT"} } }, 
    {$unwind: "$AMNT"}, 
    {$project: {avg_pmnt: "$avg_pmnt", AMNT: "$AMNT"}}, 
    {$match: { $expr: { $gt: [ "$AMNT", "$avg_pmnt" ] } }  } 
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...