MongoDB использует $regex в агрегации групп

У меня есть пример таких данных:

db.contact.insert(
    [
      { _id: 1, name: 'John legend',age: 35},
      { _id: 2, name: 'michael Ava',age: 40},
      { _id: 3, name: 'Tom holand',age: 20},
      { _id: 4, name: 'Frido pex',age: 25},
      { _id: 5, name: 'Daniel Gunava',age: 30},
      { _id: 6, name: 'Mert Brava',age: 30}
     ]

Я хочу сгруппировать и посчитать, сколько людей с именем, содержащим слово «ава», и другой группой, не содержащей ава.

Я знаю, как использовать $regex и группу в такой функции.

db.contact.find({name: {$regex: /ava/,$options: "i" }});
db.contact.aggregate([{$group: {_id: "$name",count: {$sum: 1},}}]);

как я могу объединить две функции выше. любая помощь приветствуется

Я пробовал это (не сработало)

db.contact.aggregate([
  {
    $group: {
      _id: "$name",
      {$regex: /ava/,$options: "i" }
      count: {$sum: 1},
    }
  }
]);

Для чего именно вы хотите использовать $regex в группе? если нужно «сопоставить» соответствующие документы, что происходит на этапе «$match», если нужно извлечь совпадающую подстроку, для этого есть другие операторы.

Tom Slabbaert 21.02.2024 07:29
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
1
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать $facet для двух разных случаев. Просто поместите свою попытку в конвейеры $facet.

db.contacts.aggregate([
  {
    "$facet": {
      "contains": [
        {
          "$match": {
            name: {
              $regex: "ava",
              $options: "i"
            }
          }
        },
        {
          "$group": {
            _id: "$name",
            count: {
              $sum: 1
            }
          }
        }
      ],
      notContains: [
        {
          "$match": {
            $expr: {
              $eq: [
                null,
                {
                  "$regexFind": {
                    "input": "$name",
                    "regex": "ava",
                    "options": "i"
                  }
                }
              ]
            }
          }
        },
        {
          "$group": {
            _id: "$name",
            count: {
              $sum: 1
            }
          }
        }
      ]
    }
  }
])

Игровая площадка Монго

Ответ принят как подходящий

Самый простой способ — сгруппировать элементы по нулю и создать новые поля, содержащие сумму полей, передающих нужное регулярное выражение, как показано ниже.

db. contact.aggregate({
  "$group": {
    "_id": null,
    "namesWithAva": {
      "$sum": {
        "$cond": [
          { "$regexMatch": { "input": "$name", "regex": /ava/i } },
          1,
          0
        ]
      }
    },
    "namesWithoutAva": {
      "$sum": {
        "$cond": [{ "$not": { "$regexMatch": { "input": "$name", "regex": /ava/i } } }, 1, 0]
      }
    }
  }
})

Другие вопросы по теме