У меня есть пример таких данных:
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},
}
}
]);

Вы можете использовать $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]
}
}
}
})
Для чего именно вы хотите использовать
$regexв группе? если нужно «сопоставить» соответствующие документы, что происходит на этапе «$match», если нужно извлечь совпадающую подстроку, для этого есть другие операторы.