Сгруппируйте по массиву hirearchical и получите количество для каждого уровня

#mongodb

Вопрос:

У меня есть коллекция с детализацией пользователей. каждый документ содержит адрес местоположения пользователя в виде массива.

 [
{
   "name": "User 1",
   "location": ["India", "Uttar Pradesh","Budaun","Sahaswan"]
},
{
    "name": "User 2",
    "location": ["India", "Uttar Pradesh","Budaun", "Ujhani"]
},
{
    "name": "User 3",
    "location": ["India", "Uttar Pradesh","Budaun"]
},
{
    "name": "User 4",
    "location": ["India", "Uttar Pradesh"]
},
{
    "name": "User 5",
    "location": ["Sri Lanka", "North Province", "Mannar District", "Mannar"]
}
]

 

Этот массив местоположений не является массивом фиксированной длины. Могу ли я получить количество пользователей для каждого уровня, используя агрегации mongodb?

Мой Ожидаемый Результат

 [
{
   "name": "India",
   "userCount": 4,
   "items":[
      {
        "name":"Uttar Pradesh",
        "userCount": 4,
         "items": [
            {
               "name": "Budaun",
               "userCount": 3,
               "items":[
                   {
                       "name": "Sahaswan",
                       "userCount": 1,
                       "items":[]
                   },
                   {
                       "name": "Ujhani",
                       "userCount": 1,
                       "items":[]
                   }
               ]
            }
         ]
      }
   ]
},
{
   "name": "Sri Lanka",
   "userCount": 1,
   "items":[
      {
        "name":"North Province",
        "userCount": 1,
         "items": [
            {
               "name": "Mannar District",
               "userCount": 1,
               "items":[
                   {
                       "name": "Mannar",
                       "userCount": 1,
                       "items":[]
                   }
               ]
            }
         ]
      }
   ]
}
]

 

Ответ №1:

Я думаю, что первым шагом вы можете $unwind использовать свои данные.

 db.collection.aggregate([
    {
      $unwind:
      {
        path: "$location",
        includeArrayIndex: "level",
        preserveNullAndEmptyArrays: false
      }
    }
])
 

Затем вы можете использовать выходные данные $unwind , чтобы получить то, что вы хотите.

 /* 1 */
{
    "_id" : ObjectId("612c6d30a6f18312d1338383"),
    "name" : "User 1",
    "location" : "India",
    "level" : NumberLong(0)
}

/* 2 */
{
    "_id" : ObjectId("612c6d30a6f18312d1338383"),
    "name" : "User 1",
    "location" : "Uttar Pradesh",
    "level" : NumberLong(1)
}

/* 3 */
{
    "_id" : ObjectId("612c6d30a6f18312d1338383"),
    "name" : "User 1",
    "location" : "Budaun",
    "level" : NumberLong(2)
}

/* 4 */
{
    "_id" : ObjectId("612c6d30a6f18312d1338383"),
    "name" : "User 1",
    "location" : "Sahaswan",
    "level" : NumberLong(3)
}

/* 5 */
{
    "_id" : ObjectId("612c6d30a6f18312d1338386"),
    "name" : "User 2",
    "location" : "India",
    "level" : NumberLong(0)
}

/* 6 */
{
    "_id" : ObjectId("612c6d30a6f18312d1338386"),
    "name" : "User 2",
    "location" : "Uttar Pradesh",
    "level" : NumberLong(1)
}

/* 7 */
{
    "_id" : ObjectId("612c6d30a6f18312d1338386"),
    "name" : "User 2",
    "location" : "Budaun",
    "level" : NumberLong(2)
}

/* 8 */
{
    "_id" : ObjectId("612c6d30a6f18312d1338386"),
    "name" : "User 2",
    "location" : "Ujhani",
    "level" : NumberLong(3)
}

/* 9 */
{
    "_id" : ObjectId("612c6d30a6f18312d1338389"),
    "name" : "User 3",
    "location" : "India",
    "level" : NumberLong(0)
}

/* 10 */
{
    "_id" : ObjectId("612c6d30a6f18312d1338389"),
    "name" : "User 3",
    "location" : "Uttar Pradesh",
    "level" : NumberLong(1)
}

/* 11 */
{
    "_id" : ObjectId("612c6d30a6f18312d1338389"),
    "name" : "User 3",
    "location" : "Budaun",
    "level" : NumberLong(2)
}

/* 12 */
{
    "_id" : ObjectId("612c6d30a6f18312d133838c"),
    "name" : "User 4",
    "location" : "India",
    "level" : NumberLong(0)
}

/* 13 */
{
    "_id" : ObjectId("612c6d30a6f18312d133838c"),
    "name" : "User 4",
    "location" : "Uttar Pradesh",
    "level" : NumberLong(1)
}

/* 14 */
{
    "_id" : ObjectId("612c6d30a6f18312d133838f"),
    "name" : "User 5",
    "location" : "Sri Lanka",
    "level" : NumberLong(0)
}

/* 15 */
{
    "_id" : ObjectId("612c6d30a6f18312d133838f"),
    "name" : "User 5",
    "location" : "North Province",
    "level" : NumberLong(1)
}

/* 16 */
{
    "_id" : ObjectId("612c6d30a6f18312d133838f"),
    "name" : "User 5",
    "location" : "Mannar District",
    "level" : NumberLong(2)
}

/* 17 */
{
    "_id" : ObjectId("612c6d30a6f18312d133838f"),
    "name" : "User 5",
    "location" : "Mannar",
    "level" : NumberLong(3)
}