我尝试为 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",
}
]
}
]
蒙戈查询:
db.collection.aggregate([
{
$project: {
batchData: {
batch_id: "$List.batch_id",
},
},
},
{
$unwind: "$batchData.batch_id"
},
{
$group: {
_id: "$_id",
batchData: {
$addToSet: "$batchData"
},
},
},
])
您可以先
$unwind
展平阵列以便于处理。之后,您可以再次$group
数据并使用$first
获取batchName。最后,您可以再次执行 $group
来格式化为您期望的格式。
db.collection.aggregate([
{
"$unwind": "$List"
},
{
$group: {
_id: {
_id: "$_id",
batch_id: "$List.batch_id"
},
batchName: {
$first: "$List.batchName"
},
count: {
$sum: 1
}
}
},
{
$group: {
_id: "$_id._id",
batchData: {
$push: {
"batch_id": "$_id.batch_id",
"batchName": "$batchName",
"count": "$count"
}
}
}
}
])
这里是Mongo游乐场供您参考。