gpt4 book ai didi

sorting - MongoDB如何进行多键排序?

转载 作者:可可西里 更新时间:2023-11-01 09:11:03 26 4
gpt4 key购买 nike

在 MongoDB 中,a field can have multiple values (一组值)。它们中的每一个都有索引,因此您可以过滤任何值。但是,您是否也可以“按”具有多个值的字段进行“排序”,结果是什么?

更新:

> db.test.find().sort({a:1})
{ "_id" : ObjectId("4f27e36b5eaa9ebfda3c1c53"), "a" : [ 0 ] }
{ "_id" : ObjectId("4f27e3845eaa9ebfda3c1c54"), "a" : [ 0, 1 ] }
{ "_id" : ObjectId("4f27df6e5eaa9ebfda3c1c4c"), "a" : [ 1, 1, 1 ] }
{ "_id" : ObjectId("4f27df735eaa9ebfda3c1c4d"), "a" : [ 1, 1, 2 ] }
{ "_id" : ObjectId("4f27df795eaa9ebfda3c1c4e"), "a" : [ 2, 1, 2 ] }
{ "_id" : ObjectId("4f27df7f5eaa9ebfda3c1c4f"), "a" : [ 2, 2, 1 ] }
{ "_id" : ObjectId("4f27df845eaa9ebfda3c1c50"), "a" : [ 2, 1 ] }
{ "_id" : ObjectId("4f27e39a5eaa9ebfda3c1c55"), "a" : [ 2 ] }

With unequal length arrays the longer array is "lower" than the shorter array

那么,为什么 [0] 在 [0,1] 之前,而 [2] 在 [2,1] 之后?也许只对第一个数组元素进行排序?还是最低的?然后是插入顺序?

此外,在索引扫描(相对于表扫描)的情况下,这是如何实现的?

最佳答案

数组元素的排序非常复杂。由于数组元素是单独索引的,因此对数组字段进行排序实际上会导致一些有趣的情况。发生的情况是 MongoDB 将根据数组中的最低值或最高值(取决于排序方向)对它们进行排序。除此之外,顺序是自然的。

这会导致类似的事情:

> db.test.save({a:[1]})
> db.test.save({a:[0,2]})
> db.test.find().sort({a:1})
{ "_id" : ObjectId("4f29026f5b6b8b5fa49df1c3"), "a" : [ 0, 2 ] }
{ "_id" : ObjectId("4f2902695b6b8b5fa49df1c2"), "a" : [ 1 ] }
> db.test.find().sort({a:-1})
{ "_id" : ObjectId("4f29026f5b6b8b5fa49df1c3"), "a" : [ 0, 2 ] }
{ "_id" : ObjectId("4f2902695b6b8b5fa49df1c2"), "a" : [ 1 ] }

换句话说。反向排序的顺序相同。这是因为顶部文档的“a”字段包含最低值和最高值。

对于排序如此有效,MongoDB 会忽略数组中所有不是最高值({field:-1} 排序)或最低值({field:1} 排序)的值,并对剩余值进行排序。

要绘制(过于简单的)图片,它的工作方式如下:

上面示例文档给出的索引 {a:1} 的扁平化 B 树:

"a" value 0 -> document 4f29026f5b6b8b5fa49df1c3
"a" value 1 -> document 4f2902695b6b8b5fa49df1c2
"a" value 2 -> document 4f29026f5b6b8b5fa49df1c3

如您所见,从上到下和从下到上扫描的顺序相同。

空数组是“最低”的可能数组值,因此将分别出现在上述查询的顶部和底部。

索引不会改变数组排序的行为。

关于sorting - MongoDB如何进行多键排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9074614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com