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
结果返回到数组中。
我的 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
结果返回到数组中。