Mongodb 聚合查找数组,排序不正确

Mongodb aggregation lookup array, is not sorting correctly

我的 MongoDB 集合有一个包含 ObjectId 数组的字段。 该数组包含 ObjectId 可能出现在列表中的顺序。 然后我尝试在聚合中使用 $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() 对我来说更简单。

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

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