使用$ unwind,$ lookup和$ group进行复杂聚合的mongodb正确列表顺序

时间:2018-01-19 15:22:01

标签: mongodb lookup

我有一个问题是自动解除引用子对象使用聚合并保持列表顺序这样做。第一:我的数据模型。让我们把它分解为两个集合(我使用简化的id来使它更容易理解):

会议:

{
    'id': '1',
    'some': 'abc',
    'data': 'def',
    'agendaItem': [
        ObjectId('2'),
        ObjectId('3')
    ]
}

agenda_item:

{
    'id': ObjectId('2'),
    'some': 'ghi',
    'data': 'jkl'
},
{
    'id': ObjectId('3'),
    'some': 'mno',
    'data': 'pqr'
}

我的单个(!)查询的结果应该是这样的:

{
    'id': ObjectId('1'),
    'some': 'abc',
    'data': 'def',
    'agenda_items': [
        {
            'id': ObjectId('2'),
            'some': 'ghi',
            'data': 'jkl'
        },
        {
            'id': ObjectId('3'),
            'some': 'mno',
            'data': 'pqr'
        }
    ]
}

重要的是,agenda_items列表应保持相同的顺序,id 2必须位于顶部。

目前,我使用带有展开,查找和分组的聚合来执行此类查询:

[
    {
        '$unwind': {
            'preserveNullAndEmptyArrays': True,
            'path': '$agendaItem'
        }
    },
    {
        '$lookup': {
            'from': 'agenda_item',
            'as': 'agendaItem',
            'foreignField': '_id',
            'localField': 'agendaItem'
        }
    },
    {
        '$unwind': {
            'preserveNullAndEmptyArrays': True,
            'path': '$agendaItem'
        }
    },
    {
        '$group': {
            'agendaItem': {
            '$addToSet': '$agendaItem'
            }
        }
    }
]

这给了我想要的结果 - 有一个例外:列表完全混淆,这意味着在这个例子中ObjectId('3')在ObjectId('2')之前。

使用像MongoDb这篇博文中的addFields:documentation在某种程度上是解决方案,但我不知道如何将它放入$ unwind + $ lookup链中。你能帮助我吗?或者我的策略完全错了?

德语btw中的背景:http://www.kamsky.org/stupid-tricks-with-mongodb/using-34-aggregation-to-return-documents-in-same-order-as-in-expressionhttps://oparl.org/spezifikation/online-ansicht/

1 个答案:

答案 0 :(得分:0)

我有完全相同的问题要解决。

解决方案可以在这里找到: Aggregate $lookup does not return elements original array order