Получить отдельные результаты 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" }
}}
])