当前位置: 首页 > 知识库问答 >
问题:

mongodb使用$unwind、$lookup和$group在复杂聚合中更正列表顺序

阎德义
2023-03-14

我有一个问题,使用聚合自动取消引用子对象,并保持列表顺序。第一:我的数据模型。让我们将其分解为两个集合(我使用简化的ID使其更易于理解):

会议:

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

议程项目:

{
    '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'
        }
    ]
}

重要的是,议程项目列表应保持相同的顺序,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:http://www.kamsky.org/stupid-tricks-with-mongodb/using-34-aggregation-to-return-documents-in-same-order-as-in-expression是某种解决方案,但我不知道如何将其放入$unwind$查找链中。你能帮助我吗?还是我的策略完全错了?

德语背景btw:https://oparl.org/spezifikation/online-ansicht/和https://mirror.oparl.org/body/5a3d010888dbe04745b24e0a/meeting

共有1个答案

滕学义
2023-03-14

我也有同样的问题要解决。

可以在此处找到解决方案:Aggregate$lookup不返回元素原始数组顺序

 类似资料:
  • 我需要汇总以下记录中的所有标记: https://gist.github.com/sbassi/5642925 (这个片段中有2个样本记录)并按大小对它们进行排序(首先是出现频率更高的标记)。但是我不想考虑具有特定“user_id”的数据(比方说,2,3,6和12)。 以下是我的尝试(只是聚合,没有过滤和排序): db。用户库。聚合({$unwind:“$annotations.data.tags

  • 我有一种情况,我需要根据一个数组值执行一个group by操作,该数组值将字段值的出现次数相加。然后对计数进行过滤,并准备结果,以便根据条件显示结果。从本质上讲,文档被转换回如果您只使用find函数就会呈现的方式。由于matchedDocuments数组中收集的项的数量,我遇到了临时文档太大的问题。任何关于如何改进这一点的建议都将是有益的。 以下是一些示例文档和基于上述标准的预期结果:

  • 本文向大家介绍MongoDB教程之聚合(count、distinct和group),包括了MongoDB教程之聚合(count、distinct和group)的使用技巧和注意事项,需要的朋友参考一下 1. count:      2. distinct:     distinct用来找出给定键的所有不同的值。使用时也必须指定集合和键。   3. group:     group做的聚合有些复杂。先

  • 我是聚合框架的新手,有以下问题。 我的收藏是这样的: 用户 ActivitiesFeed 活动 聚合函数 如何使用第一个查找结果进行查找? 我查阅了activities集合。此集合保存第二个查找BaseData.UserID的id。但是使用这种方法,第二次查找没有结果。 我对activities集合进行连接的原因是actionID可以保存来自另一个集合的用户id或文档id。它取决于activiti

  • 多亏了这里的人的帮助,我成功地在我的文档中找到了两个ID,并在另一个集合中找到了他们的代表文档。我需要采取的下一步是进一步查找一个“嵌套”ID(引用另一个集合中的文档)。 其结果如下: 我希望chieftain部分是这样的(这就是没有添加'last'$lookup'的chieftain文档的样子):