Группировать по содержимому массива строк без порядка в агрегации монго

у меня проблема с фреймворком агрегации в MongoDB (mongoose) вот в чем проблема. У меня есть следующая схема базы данных. Поэтому я хочу подсчитать количество людей, у которых есть доступ только через Mobile, только Card или и то, и другое. без всякого порядка,

  {
       '_id': ObjectId,
       'user_access_type': ['Mobile' , 'Card']
   }
    {
       '_id': ObjectId,
       'user_access_type': ['Card' , 'Mobile']
   }
    {
       '_id': ObjectId,
       'user_access_type': ['Mobile']
   }
  {
       '_id': ObjectId,
       'user_access_type': ['Card']
   }

Теперь я использую это, но оно группируется только по порядку массива user_access_type,

[ { "$group" : {   "_id": {"User" : "$user_access_type"} ,   "count": {"$sum" : 1}   }]   

это вывод:

{
            "_id": {
                "User": [
                    "Card",
                    "Mobile"
                ]
            },
            "count": 1
        },
        {
            "_id": {
                "_id": "5f7dce2359aaf004985f98eb",
                "User": [
                    "Mobile",
                    "Card"
                ]
            },
            "count": 1
        },
        {
            "_id": {
                "User": [
                    "Mobile"
                ]
            },
            "count": 1
        },
        
        {
            "_id": {
                "User": [
                    "Card"
                ]
            },
            "count": 1
        },

против того, что я хочу:

  {
            "_id": {
                "User": [
                    "Card",
                    "Mobile"     // we can say both
                ]
            },
            "count": 2     // does not depend on order
        },
        {
            "_id": {
                "User": [
                    "Mobile"
                ]
            },
            "count": 1
        },
        {
            "_id": {
                "User": [
                    "Card"
                ]
            },
            "count": 1
        },
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
0
168
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы также можете использовать другой вариант, используя $function,

  • $function можно добавить javascript код, вы можете использовать sort() для сортировки массива
db.collection.aggregate([
  {
    $addFields: {
      user_access_type: {
        $function: {
          body: function(user_access_type){
              return user_access_type.sort();
          },
          args: ["$user_access_type"],
          lang: "js"
        }
      }
    }
  },
  {
    $group: {
      _id: "$user_access_type",
      count: { $sum: 1 }
    }
  }
])

Второй вариант,

Если массив user_access_type всегда содержит уникальные элементы, вы можете использовать оператор $setUnion для массива user_access_type как самообъединение, каким-то образом это изменит порядок массива в том же порядке,

db.collection.aggregate([
  {
    $addFields: {
      user_access_type: {
        $setUnion: "$user_access_type"
      }
    }
  },
  {
    $group: {
      _id: "$user_access_type",
      count: { $sum: 1 }
    }
  }
])

Детская площадка

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