#mongodb #mongodb-query
#mongodb #mongodb-запрос
Вопрос:
Я пытаюсь создать запрос для MongoDB, который возвращает все уникальные значения из массива в документе по значению ключа ( batch_id
). Мне удалось сделать это, сгруппировав уникальные batch_ids
, однако я не могу извлечь соответствующее значение ключа ( batchName
) и подсчитать количество объектов, которые имели уникальные значения для каждого массива.
Как мне извлечь batchName
и подсчитать количество объектов? Я попробовал несколько вещей, однако, думаю, у меня возникли проблемы $addToSet
.
MongoPlayground: https://mongoplayground.net/p/j6Jkeh79Zqq
Мой текущий результат:
[
{
"_id": "6032a5ad80443334a35f2232",
"batchData": [
{
"batch_id": "6032a5af80443334a35f2267TB"
},
{
"batch_id": "6032a5af80443334a35f26467JC"
},
{
"batch_id": "6032a5af80443334a5f74367UI"
}
]
}
]
Мой ожидаемый результат
[
{
"_id": "6032a5ad80443334a35f2232",
"batchData": [
{
"batch_id": "6032a5af80443334a35f2267TB",
"batchName": "Test 2",
"count": 2
},
{
"batch_id": "6032a5af80443334a35f26467JC",
"batchName": "Test 3",
"count": 1
},
{
"batch_id": "6032a5af80443334a5f74367UI",
"batchName": "Test 1",
"count": 2
}
]
}
]
Пример документа:
[
{
"_id": "6032a5ad80443334a35f2232",
"List": [
{
"_id": "6032a5af80443334a35f2234",
"batch_id": "6032a5af80443334a5f74367UI",
"batchName": "Test 1",
},
{
"_id": "6032a5b080443334a35f2236",
"batch_id": "6032a5af80443334a5f74367UI",
"batchName": "Test 1",
},
{
"_id": "6032a5b080443334a35f2238",
"batch_id": "6032a5af80443334a35f2267TB",
"batchName": "Test 2",
},
{
"_id": "6032a5b080443334a35f2239",
"batch_id": "6032a5af80443334a35f2267TB",
"batchName": "Test 2",
},
{
"_id": "6032a5b080443334a35f2234",
"batch_id": "6032a5af80443334a35f26467JC",
"batchName": "Test 3",
}
]
}
]
Запрос Mongo:
db.collection.aggregate([
{
$project: {
batchData: {
batch_id: "$List.batch_id",
},
},
},
{
$unwind: "$batchData.batch_id"
},
{
$group: {
_id: "$_id",
batchData: {
$addToSet: "$batchData"
},
},
},
])
Ответ №1:
Вы можете сначала $unwind
сгладить массив для облегчения обработки. После этого вы можете $group
снова использовать данные и использовать $first
для получения имени пакета. Наконец, вы можете сделать еще $group
один шаг для форматирования в ожидаемый формат.
Вот игровая площадка Монго для вашей справки.