我有两个集合,像
collA{...}
和
collB
{
...
data: [{type: ObjectId, ref: 'CollA'}],
}
当我使用查找来获取引用看起来像下面它工作完美,但数组的顺序改变了
{"$lookup": {
"from": "collA",
"localField": "data",
"foreignField": "_id",
"as": "data"
}},
在我的例子中我有
collB {
...
data [
0: collA_0,
1: collA_1
]
}
但是当使用像
这样的查询结果时{
...
data [
0: collA_1,
1: collA_0
]
}
的顺序被改变了。这是默认的查找吗?我该怎么排序呢?
是,当使用$lookup
时,不能保证返回文档的顺序。文档以"自然顺序"返回。-当它们在数据库中遇到时。获得保证一致顺序的唯一方法是向查询添加$sort
阶段。如果文档在您正在使用的ODM中排序,则可能会插入$sort
或在ODM中对对象进行排序。
您可以尝试这个示例查询来对MongoDB 3.6及以上版本的输出进行排序。
查看此文档以获取更多信息:
db.coll1.aggregate([
{
"$match": {
_id: 1
}
},
{
"$lookup": {
"from": "coll2",
"localField": "data",
"foreignField": "_id",
let: {
"data_id": "$data",
},
pipeline: [
{
"$addFields": {
index: {
$indexOfArray: [
"$$data_id",
"$_id"
]
},
}
},
{
"$sort": {
index: 1
}
},
{
"$project": {
index: 0
}
}
],
"as": "output"
}
}
])
这里是到playground的链接,用于测试查询Mongo playground
在$lookup之后,您可以对$lookup的结果进行$排序
[{$unwind: '$data'},
{$sort: {'data._id':-1}},
{$group: {_id: '$_id', 'data': {$push:
'$data._id'}}},
{$project: {'data':
'$data'}}]