mongodb查找时的数组引用顺序



我有两个集合,像

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 Jira

您可以尝试这个示例查询来对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'}}]

最新更新