node.js - 查找时数组引用的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 及更高版本的输出进行排序。
查看此文档以获取更多信息Join Conditions and Subqueries on a Joined Collection:
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"
}
}
])
这是测试查询Mongo Playground的游乐场链接
推荐阅读
- c++ - 使用浮点键实现类似哈希表的数据结构,其中容差内的值被合并在一起
- java - 如何更正此代码以正确加载 ImageIcon
- python - asyncio/aiohttp - 如何进行一系列异步 - 但依赖 - 请求?
- android - Android - 启动时出现异常(对于某些用户)
- python - 如何从不同的进程访问全局变量
- javascript - IntersectionObserver.observe 不是对象,如何使用 IntersectionObserver
- python - 关于在pdf文档python中突出显示文本的问题
- plsql - 如何在 PL/SQL 中删除每个月的重复项
- amazon-web-services - ElasticSearch 节点故障
- python-3.x - 如何在 python 中使用 XlsxWriter