【发布时间】:2021-06-22 23:06:20
【问题描述】:
我有一个看起来像这样的集合:
{
"_id" : id1,
"field1" : 11,
"field2": 101,
"localityID" : 27
}
{
"_id" : id2,
"field1" : 22,
"field2": 202,
"localityID" : 27
}
{
"_id" : id3,
"field1" : 33,
"field2": 303,
"localityID" : 27
}
{
"_id" : id4,
"field1" : 44,
"field2": 404,
"localityID" : 27
}
{
"_id" : id5,
"field1" : 55,
"field2": 505,
"localityID" : 27
}
{
"_id" : id6,
"field1" : 66,
"field2": 606,
"localityID" : 61
}
{
"_id" : id4,
"field1" : 77,
"field2": 707,
"localityID" : 61
}
用例 - 我想以 3 的批次检索和处理具有相同 localityID 的记录。
出于跟踪目的,我还想跟踪在特定批次中处理的记录
同样,我想使用 MongoDB 的聚合框架来组合具有相同 localityID 但最大为固定大小(如上所述为 3)的集合。
我想将上面的集合更新为:
{
"_id" : "id111",
"batchId" : "batch1",
"localityID": 27,
"batches": [
{
"field1" : 11,
"field2": 101
},
{
"field1" : 22,
"field2": 202
},
{
"field1" : 33,
"field2": 303
}
]
}
{
"_id" : "id222",
"batchId" : "batch2",
"localityID": 27,
"batches": [
{
"field1" : 44,
"field2": 404
},
{
"field1" : 55,
"field2": 505
}
]
}
{
"_id" : "id333",
"batchId" : "batch1",
"localityID": 61,
"batches": [
{
"field1" : 66,
"field2": 606
},
{
"field1" : 77,
"field2": 707
}
]
}
我尝试了几种聚合函数的组合,如下所示,但未能获得预期的结果。
(这能够将所有具有相同localityID 的记录组合在一起但只能在一个文档中,而不是批量)
db.old_collection.aggregate([
{ "$group": { "_id": "$localityID" } },
{ "$lookup": {
"from": "old_collection",
"let": { "lid": "$_id" },
"pipeline": [
{ "$match": { "$expr": { "$eq": [ "$localityID", "$$lid" ] } }},
{ "$project": { "_id": 0, "field1": 1, "field2": 1 } }
],
"as": "batches"
}},
{"$out": "new_collection" }
])
上述聚合函数产生以下结果 -
{
"_id" : "id111",
"batchId" : "batch1",
"localityID": 27,
"batches": [
{
"field1" : 11,
"field2": 101
},
{
"field1" : 22,
"field2": 202
},
{
"field1" : 33,
"field2": 303
},
{
"field1" : 44,
"field2": 404
},
{
"field1" : 55,
"field2": 505
}
]
}
{
"_id" : "id333",
"batchId" : "batch1",
"localityID": 61,
"batches": [
{
"field1" : 66,
"field2": 606
},
{
"field1" : 77,
"field2": 707
}
]
}
这可以通过 Mongo 的聚合框架实现吗?或者我会用其他东西更好吗?
【问题讨论】:
-
您的聚合管道没有任何
batchId字段,因此您提供的结果肯定不是来自此聚合管道。我不明白batchId字段的逻辑。 -
是 @WernfriedDomscheit ,
batchId字段在输入中不存在。 .每个localityID的batchId的值可以是一个简单的序列号,从0 到为该localityID创建的文档总数
标签: mongodb mongodb-query aggregation-framework aggregate-functions