Получить отдельные результаты Mongodb Среднее из двух столбцов

У меня есть набор данных, как т

{
    "_id" : ObjectId("5a867bae000e4f1c9c77d36d"),
    "userid" : "5a20ee1acdacc7086ce7742d",
    "sprice" : null,
    "lprice" : 4.2,
    "fruit" : "@Apple",
    "createdate" : ISODate("2018-02-16T06:35:26.285Z"),
    "__v" : 0
},
{
    "_id" : ObjectId("5a867bae000e4f1c9c77d36e"),
    "userid" : "5a20ee1acdacc7086ce7742e",
    "sprice" : 3.5,
    "lprice" : null,
    "fruit" : "@Apple",
    "createdate" : ISODate("2018-02-16T06:35:26.285Z"),
    "__v" : 0
},
{
    "_id" : ObjectId("5a867bae000e4f1c9c77d36e"),
    "userid" : "5a20ee1acdacc7086ce7742e",
    "sprice" : 8.6,
    "lprice" : 2.2,
    "fruit" : "@Apple",
    "createdate" : ISODate("2018-02-16T06:35:26.285Z"),
    "__v" : 0
}

для этого мне нужно вычислить средний спрайс '@Apple' и пренебречь теми записями, которые имеют значение NULL.

Для этого Мой запрос похож на этот, который возвращает именно то, что я хочу, т.е.

db.Collection.aggregate([
    { "$match": {
        "fruit": "@Apple",
        "sprice": {$ne:null}
    }},
    { "$group": {
        "_id": null,
        "sprice": { "$avg": "$sprice" }
    }}
])

Это дает мне результат. Теперь мой вопрос: если я хочу получить индивидуальный результат от sprice и lprice, то как изменяется мой запрос.

Ожидаемый ответ будет таким:

{ "_id" : null, "sprice" : 6.05 } // Already Get from this query
{ "_id" : null, "lprice" : 3.2 } //Desired Result.

Любая помощь приветствуется

2 ответа

Решение

С $facet

db.Collection.aggregate([
    { "$match": { "fruit": "@Apple" } },
    {
        "$facet": {
            "sprice": [
                { "$match": { "sprice": { "$ne": null } } },
                { "$group": {
                    "_id": null,
                    "sprice": { "$avg": "$sprice" }
                }}
            ],   
            "lprice": [
                { "$match": { "lprice": { "$ne": null } } },                
                { "$group": {
                    "_id": null,
                    "lprice": { "$avg": "$lprice" }
                }}
            ]
        }
    }
])

Пример вывода

[
    { "sprice": { "_id" : null, "sprice" : 6.05 } },
    { "lprice": { "_id" : null, "lprice" : 3.2 } }
]

$avg по умолчанию игнорирует не числовые значения, поэтому не требуется явный нулевой фильтр, ниже конвейера даст желаемые результаты

db.Collection.aggregate([
    { "$match": {
        "fruit": "@Apple"        
    }},
    { "$group": {
        "_id": null,
        "sprice": { "$avg": "$sprice" },
        "lprice": { "$avg": "$lprice" }
    }}       
])
Другие вопросы по тегам