【问题标题】:Mongodb aggregation lookup array, is not sorting correctlyMongodb聚合查找数组,未正确排序
【发布时间】:2020-04-20 01:12:16
【问题描述】:

我的 MongoDB 集合有一个包含 ObjectId 数组的字段。 此数组包含 ObjectIds 可能出现在列表中的顺序。 然后我尝试在聚合中使用 $lookup,它会按创建顺序对我的数组进行排序。

当我只使用时:

$project: {
                list: 1
            }

结果是元素的正确顺序:

[
  5e9b7dc0500c9a5c3809b0c8,
  5e9b7efad230686164a64bdb,
  5e9b7dfc6244792818f7cdba,
  5e9b7e355a7c843e90a2ed48,
  5e9b7e86efb9111d1c91ea77,
  5e9b7eb26463144eac64cb16
]

当我使用查找时,顺序会发生变化:

$lookup: { 
        from: 'users',
        localField: 'user',
        foreignField: '_id',
        as: 'list'
    }
},
{
    $project: {
        list: 1
    }
}

结果

[
{_id: 5e9b7dc0500c9a5c3809b0c8 },
{_id: 5e9b7dfc6244792818f7cdba },
{_id: 5e9b7e355a7c843e90a2ed48 },
{_id: 5e9b7e86efb9111d1c91ea77 },
{_id: 5e9b7eb26463144eac64cb16 },
{_id: 5e9b7efad230686164a64bdb }
]

有人可以帮我解决这个问题吗?

编辑:

在这种情况下,使用 findOne().populate() 而不是 aggregate() 对我来说是更简单的选择。

【问题讨论】:

    标签: mongodb sorting mongoose aggregation-framework lookup


    【解决方案1】:

    $lookup 阶段在查询from 集合时按照它们遇到的顺序返回字段。由于foreignField_id,查询执行器可能会使用{_id:1} 索引来查找这些文档,这意味着它们将按照它们在该索引中出现的顺序出现,即按_id 排序。由于 ObjectId 的前几位是创建 id 的纪元时间,因此它们会按创建顺序提供给您。

    如果您需要将字段按特定顺序排列,您将需要在查找的文档中添加一个字段,您可以对其进行排序,或者在查找之前$unwind 数组,以便每次查找返回一个文档,然后$group 将结果返回到一个数组中。

    【讨论】:

    • 我明白了!谢谢!!非常好,我将在更复杂的解决方案中使用它!!但是,在这种情况下,使用 findOne().populate() 我得到了预期的结果。谢谢你,乔!!!
    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 2019-01-14
    • 2023-02-10
    • 2015-12-28
    • 2021-01-15
    • 2015-01-28
    • 2019-04-12
    • 1970-01-01
    相关资源
    最近更新 更多