MongoDB排序后分组聚合$first取值结果不一致问题
数据
我的集合存储非嵌套结构的交易数据,第三方每年会发生1~2次schema变更,我计划创建schema变更表,记录各版本交易schema及其对应的effective_date,当前需要为Mongo集合内的存量数据初始化该表。
原始数据的核心字段结构如下:
[_id, ..., [...], ..., g_uploaded_at, g_unique_id]
(其中[...]为交易特征字段,如Time、Amount等,不参与本次聚合计算)
带分组阶段的聚合实现
参考相关技术方案,我编写了如下聚合管道,预期每次schema变更返回一条结果,包含3个字段:
all_keys:所有特征字段/表头的拼接结果g_unique_id:对应该schema特征的某条记录的唯一标识g_uploaded_at:预期为排序后对应schema最早/最新记录的日期值
遇到的问题
该聚合的返回结果不稳定、不一致,我的核心目标是通过排序和分组操作明确schema变更的时间边界,当前使用的聚合代码如下:
result = coll.aggregate([ {'$sort': {'g_uploaded_at': -1}}, { '$project': { 'data': {'$objectToArray': "$$ROOT"}, 'g_unique_id': 1, 'g_uploaded_at': 1} }, {'$unwind': "$data"}, {'$project': {'g_uploaded_at': 1, 'g_unique_id': 1, 'key': "$data.k", '_id': 0}}, {'$sort': {'key': 1}}, { '$group': { '_id': "$g_unique_id", 'all_keys': {'$push': "$key"}, 'g_uploaded_at': {'$first': "$g_uploaded_at"}, } }, { '$project': { 'all_keys': 1, 'g_uploaded_at': 1, 'all_keys_string': { '$reduce': { 'input': "$all_keys", 'initialValue': "", 'in': {'$concat': ["$$value", "$$this"]} } } } }, { '$group': { '_id': "$all_keys_string", 'all_keys': {'$first': "$all_keys"}, 'g_unique_id': {'$first': "$_id"}, 'g_uploaded_at': {'$first': "$g_uploaded_at"}, } }, {'$unset': "_id"}, ])
复现测试
在构造的共11条记录的测试数据集上多次运行该聚合,值为BAZ的all_keys对应的记录会(多次尝试后可复现)在不同id、日期值之间循环变动。
我参考公开技术文档的说明使用$first运算符,本人刚接触MongoDB,想确认该问题是否为入门使用错误导致,以及如何修正。
内容的提问来源于stack exchange,提问作者xtian
相关产品推荐
相关产品推荐

