Как запросить $ regex во встроенных документах для подсчета различных значений - PullRequest
0 голосов
/ 15 мая 2018

У меня есть коллекция с документами в следующем формате:

{ 
    "_id" : ObjectId("abc"), 
    "mobile" : "123456789", 
    "channels" : [
        {
            "name" : "email.xz", 
            "type" : "a", 
            "properties" : [
                {
                    "provider" : "outlook"
                }
            ]
        }, 
        {
            "name" : "sms", 
            "type" : "sms"
            }
    ], 

}

Мне нужно найти клиентов, у которых есть хотя бы один канал, имя которого заканчивается на «.xz», но только если поставщик существует иимеет значение и возвращает количество клиентов на канал.Например:

email.xz = 10
sms.xz = 5
push.xz = 7

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

db.consumers.aggregate(
{$match: {"channels.name": {$regex: ".xz$"}, 
"notificationChannels.properties.provider": { $exists: true }}},
{$group: {_id: "channels.name"},
count: {$sum: 1}})

1 Ответ

0 голосов
/ 15 мая 2018

$unwind массив, а затем $match снова таким же образом. Первый матч - это только выбор документов, и вы хотите отфильтровать:

db.consumers.aggregate(
  { $match: {
    "channels.name": {$regex: ".xz$"}, 
    "channels.properties.provider": { $exists: true }
  }},
  { $unwind: "$channels" },
  { $match: {
    "channels.name": {$regex: ".xz$"}, 
    "channels.properties.provider": { $exists: true }
  }},
  { $group:{
    "_id": "$channels.name",
    "count": {$sum: 1}
  }}
)

Поскольку вы хотите $group на ключе из "массива" массива, вам все равно нужно $unwind. Поскольку вам нужны только те записи массива, которые соответствуют вашим условиям, единственный способ сделать это с $regex - через $match после $unwind

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...