带边界的多键索引mongodb

问题描述:

我想弄清楚多键索引的界限与我有一个例子。带边界的多键索引mongodb

s1:PRIMARY> db.inventory.find(); 
{ "_id" : 2, "item" : "ABCx", "ratings" : [ 4, 3 ] } 
{ "_id" : 3, "item" : "ABC", "ratings" : [ 2, 9 ] } 
{ "_id" : 4, "item" : "XYZ", "ratings" : [ 4, 3 ] } 

我一找到这样

s1:PRIMARY> db.inventory.find({ ratings: { $gte: 5 ,$lte:8} }); 

输出:

{ "_id" : 3, "item" : "ABC", "ratings" : [ 2, 9 ] }

按照这里的文档和我引用(报价包含比我不同的例子)

查询会在等级数组中搜索至少一个大于等于3的 以及至少一个小于等于6的元素。 由于单个元素不需要满足两个条件,因此MongoDB 不会与范围并使用[[3,Infinity]]或[ - 无穷大,6]]。 MongoDB不保证它选择哪个这两个边界。

https://docs.mongodb.com/manual/core/multikey-index-bounds/

在此基础上的文档,我应该有所有3行作为我的输出,而不只是一个排。

有人可以解释这是怎么工作的?

两个$gte$lte必须文档的result.find()方法阵列内的至少一种元素相匹配。因此,对于$gte: 5, $lte: 8

  • _id: 2具有[ 4, 3 ] =>$lte: 8匹配任一元素,但$gte: 5无法匹配任何34,所以不返回;
  • _id: 3[ 2, 9 ] =>$lte: 8匹配2$gte: 5匹配9,所以它被返回;
  • _id: 4[ 4, 3 ] =>与_id: 2相同。

因此,只有返回_id: 3的文档才有意义。将一个元素$gte: 5添加到_id: 2_id: 4文档的result数组中,它将匹配该文档!