【发布时间】:2020-11-17 15:03:18
【问题描述】:
我正在徘徊是否在聚合管道中为嵌套数组的文档使用 $unwind 运算符是否会以与数组中项目的顺序相同的顺序返回解构的文档。 例子: 假设我有以下文件
{ "_id" : 1, "item" : "foo", values: [ "foo", "foo2", "foo3"] }
{ "_id" : 2, "item" : "bar", values: [ "bar", "bar2", "bar3"] }
{ "_id" : 3, "item" : "baz", values: [ "baz", "baz2", "baz3"] }
我想在我的应用程序代码中对所有文档中的所有值使用分页。所以,我的想法是使用 mongo 聚合框架来:
- 按_id对文档进行排序
- 在
values属性上使用$unwind 来解构文档 - 使用 $skip 和 $limit 来模拟分页
所以使用上述示例的问题是:
是否保证以下聚合管道:
[
{$sort: {"_id": 1}},
{$unwind: "$values"}
]
将始终导致以下文档具有完全相同的顺序?:
{ "_id" : 1, "item" : "foo", values: "foo" }
{ "_id" : 1, "item" : "foo", values: "foo2" }
{ "_id" : 1, "item" : "foo", values: "foo3" }
{ "_id" : 2, "item" : "bar", values: "bar" }
{ "_id" : 2, "item" : "bar", values: "bar2" }
{ "_id" : 2, "item" : "bar", values: "bar3" }
{ "_id" : 3, "item" : "baz", values: "baz" }
{ "_id" : 3, "item" : "baz", values: "baz2" }
{ "_id" : 3, "item" : "baz", values: "baz3" }
【问题讨论】:
-
我不能依赖这个在线示例。在现实生活中,我将在数组中有更多的文档和项目(可能是数百万)。我正在寻找官方答案。就像简单的
find({})不能保证文档的顺序一样,但是用一小部分文档测试它返回的顺序是一样的 -
这没有明确记录,如果您为 Atlas 或 MongoDB Enterprise 付费,我建议您通过官方支持渠道。
-
MongoDB 源代码调用 libunwind 函数迭代链中的帧。由于此类函数读取磁盘上的二进制文件,因此无法更改顺序、跳过、交换帧...
-
@Valijon。谢谢你的回答。我不知道wiredTiger 引擎实际上是如何将文档存储在磁盘上的。但它看起来合乎逻辑,因为数组顺序得到保证,被破坏的文档的顺序总是相同的。甚至,官方文档中的示例都是有序的:),但如果我们可以依赖该顺序,则没有提及。
标签: mongodb mongodb-query aggregation-framework