Группа в монго, исключая нулевые значения
У меня есть запрос mongo, который выполняет групповую операцию над документами.
Я получил почти ожидаемые результаты, за исключением того, что хочу уточнить результаты без пустых или нулевых значений.
В настоящее время мой запрос выглядит так:
db.productMetadata.aggregate([{$group:{"_id":{"color":"$productAttribute.colour","gender":"$productAttribute.gender"},"count" : {$sum : 1}}}]);
И результаты выглядят примерно так:
{ "_id" : { "color" : "BLUE", "gender" : "MEN" }, "count" : 1 }
{ "_id" : { }, "count" : 4 }
{ "_id" : { "color" : "NA", "gender" : "WOMEN" }, "count" : 1 }
{ "_id" : { "color" : "BLACK", "gender" : "MEN" }, "count" : 1 }
{ "_id" : { "color" : "BROWN", "gender" : "WOMEN" }, "count" : 1 }
{ "_id" : { "gender" : "MEN" }, "count" : 2 }
{ "_id" : { "color" : "BEIGE", "gender" : "MEN" }, "count" : 1 }
{ "_id" : { "color" : "BROWN", "gender" : "MEN" }, "count" : 1 }
Я хочу удалить строки, если какая-либо из значений группы по полю пустая или нулевая в фактических данных БД.
Исключенные результаты должны выглядеть примерно так:
{ "_id" : { "color" : "BLUE", "gender" : "MEN" }, "count" : 1 }
{ "_id" : { "color" : "NA", "gender" : "WOMEN" }, "count" : 1 }
{ "_id" : { "color" : "BLACK", "gender" : "MEN" }, "count" : 1 }
{ "_id" : { "color" : "BROWN", "gender" : "WOMEN" }, "count" : 1 }
{ "_id" : { "color" : "BEIGE", "gender" : "MEN" }, "count" : 1 }
{ "_id" : { "color" : "BROWN", "gender" : "MEN" }, "count" : 1 }
Ответы
Ответ 1
Вам нужен дополнительный шаг конвейера $match
, который отфильтрует входящие документы на основе существующего встроенного поля "$productAttribute.colour"
, а не ноль:
db.productMetadata.aggregate([
{
"$match": {
"productAttribute.colour": {
"$exists": true,
"$ne": null
}
}
},
{
"$group": {
"_id": {
"color": "$productAttribute.colour",
"gender": "$productAttribute.gender"
},
"count": {
"$sum": 1
}
}
}
]);
Ответ 2
Возможно, вам нужно использовать $match: {'color': {$ exists: true}} перед операцией $group. С редким индексом он будет работать довольно быстро.
И не храните "нулевые" поля в коллекциях вообще, что уменьшит размер db и увеличит скорость поиска для sparse индексов (меньше документов в индексе → больше скорости)
Ответ 3
этот пример включает в себя две разные коллекции. Для этого мы используем агрегатную функцию. Я также использую Mongoose
- Я присоединяюсь к полю cusmtom с помощью customfiellabels с помощью $ lookup
- Развернуть массив с помощью $ unwind
- $ match, чтобы исключить имя, для которого в тексте указано НЕАКТИВНО (я использую REGEX)
$ project для переименования полей, чтобы они правильно отображались на клиенте
async getAllMasterDataCustomFields (req) {
let response = {};
try {
response = await customfieldsModel.aggregate([
{
$lookup: {
from: 'customfieldlabels',
localField: 'cfId',
foreignField: 'cfId',
as: 'info'
}
},
{ '$unwind': { 'path': '$info', 'preserveNullAndEmptyArrays': true } },
{ '$match': { 'childs.name': { $not: /INACTIVE/ }}},
{
$project: {
'cfId': 1,
'label': '$info.label',
'type': '$info.type',
'childs': 1
}
}]).exec();
} catch (e) {
logger.log('error', 'Error while getting response ${e.meesage}');
}
return response;
}
.