Thi*_*ilo 4 sorting mongodb multikey
在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 ] }
Run Code Online (Sandbox Code Playgroud)
对于不等长度的数组,较长的数组比较短的数组"低"
那么,为什么[0]之前的[0],[2,1]之后的[2]呢?可能只对第一个数组元素进行排序吗?还是最低的一个?之后是插入顺序?
另外,在索引扫描的情况下(与表扫描相反)如何实现?
数组元素的排序非常复杂.由于数组元素被索引,因此在数组字段上单独排序实际上会导致一些有趣的情况.会发生什么是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 ] }
Run Code Online (Sandbox Code Playgroud)
换一种说法.反向排序的顺序相同.这是因为顶部文档的"a"字段同时包含最低值和最高值.
因此有效地排序MongoDB忽略数组中不是最高({field:-1}排序)或最低({field:1}排序)的所有值,并对剩余值进行排序.
要绘制(过度简化的)图片,它的工作原理如下:
在上面的示例文档中给出索引{a:1}的展平b-tree:
"a" value 0 -> document 4f29026f5b6b8b5fa49df1c3
"a" value 1 -> document 4f2902695b6b8b5fa49df1c2
"a" value 2 -> document 4f29026f5b6b8b5fa49df1c3
Run Code Online (Sandbox Code Playgroud)
如您所见,从顶部到底部以及从底部到顶部的扫描将产生相同的顺序.
空数组是"最低"可能的数组值,因此将分别出现在上述查询的顶部和底部.
索引不会更改数组上的排序行为.
| 归档时间: |
|
| 查看次数: |
1694 次 |
| 最近记录: |