You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:36:23