Sorting MongoDB多键如何排序?

Sorting MongoDB多键如何排序?,sorting,mongodb,multikey,Sorting,Mongodb,Multikey,在MongoDB中,(一个值数组)。它们中的每一个都是索引的,因此您可以对任何值进行筛选。但是,您是否也可以“按顺序”对具有多个值的字段进行排序?结果如何 更新: > db.test.find().sort({a:1}) { "_id" : ObjectId("4f27e36b5eaa9ebfda3c1c53"), "a" : [ 0 ] } { "_id" : ObjectId("4f27e3845eaa9ebfda3c1c54"), "a" : [ 0, 1 ] } { "_id" :

在MongoDB中,(一个值数组)。它们中的每一个都是索引的,因此您可以对任何值进行筛选。但是,您是否也可以“按顺序”对具有多个值的字段进行排序?结果如何

更新:

> 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 ] }
对于长度不等的数组,较长的数组比较短的数组“低”

那么,为什么[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
正如您所看到的,从上到下和从下到上的扫描将产生相同的顺序

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


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

使用索引时仍然是这样吗?是的,这是索引不会改变查询结果的实例之一。不幸的是,MangoDB并不总是如此(坦白地说,我认为这是一个bug)。有些查询会给出不同的结果。例如,使用稀疏索引会使带有$exists:false子句的count()查询返回0,即使这在事实上并不准确。实际上,这是一个更相关的问题:谢谢,我就是这么想的。再次接受。这需要记录在Mongo网站上。