#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)
}