猿教程 Logo

.Net连接MongoDb:索引数组

介绍

在上一篇文章中,我们研究了MongoDb中的复合索引。 如果要使多场搜索更有效率,复合索引可能会很有用。 例如。 如果频繁搜索“名称”和“年龄”上的过滤器,则复合索引是使搜索更有效率的良好候选者。 复合定义中键的确切顺序很重要。 最左边的键是主键,其次是辅助键等等。 辅助键字段上的搜索不会使用复合索引。

在这篇文章中,我们将介绍索引数组字段。

数组索引

索引数组实际上与索引简单的数据类型(如整数和字符串)无异。 我们的演示集合 - 邮政编码和餐馆 - 没有合适的阵列字段。 因此,我们将创建我们自己的小集合。 我们之前创建了一个叫做“人”的人,但是我们将从零开始重新创建它。 在MongoDb客户端shell中运行以下命令:

use model
db.people.drop()
db.people.insert({"name" : "John", "sports" : ["football", "badminton", "squash"], "grades" : [50, 60,45, 43]})
db.people.insert({"name" : "Mary", "sports" : ["cricket", "badminton"], "grades" : [90, 60, 53]})
db.people.insert({"name" : "William", "sports" : ["tennis", "basketball", "squash"], "grades" : [30, 40,64, 90, 78]})
db.people.insert({"name" : "Bridget", "sports" : ["baseball", "athletics", "running"], "grades" : [50, 90,95, 40]})
db.people.insert({"name" : "Susan", "sports" : ["football", "boxing", "karate"], "grades" : [70, 80,78]})
db.people.insert({"name" : "Andrew", "sports" : ["cyckling", "swimming", "basketball"], "grades" : [10, 90,60, 50]})
db.people.insert({"name" : "Phil", "sports" : ["handball", "skating", "baseball"], "grades" : [55, 65]})
db.people.insert({"name" : "Joanna", "sports" : ["judo", "karate", "running"], "grades" : [88, 77,66, 55]})
db.people.insert({"name" : "Christina", "sports" : ["running", "swimming", "badminton"], "grades" : [51, 61,46, 44]})
db.people.insert({"name" : "Homer", "sports" : ["football", "skating", "boxing"], "grades" : [45, 47,90, 99]})

共有10个文档,每个文件共有2个数组字段。 我们现在想找到所有喜欢空手道的人。 这应该很容易,现在我希望:

db.people.find({"sports" : "karate"})

它找到两个人:苏珊和乔安娜。

我们在数组字段中添加一个与之前操作过的createIndex命令相同的索引:

db.people.createIndex({"sports" : 1})

我们可以通过运行我们的好友的explain()函数来看到索引的动作:

db.people.explain(true).find({"sports" : "karate"})

¨

它告诉我们,使用我们刚刚创建的sports_1索引执行索引扫描,并且完全扫描了两个文档。 因为这等于我们满意的返回文件的数量。

我们可以在名称和体育领域有一个复合指数吗? 让我们来看看:

db.people.createIndex({"name" : 1, "sports" : 1})

是的,这是可能的。 如果我们想要在2个数组字段上具有复合索引,该怎么办? 毕竟,一个潜在的查询可能是提取所有喜欢足球的人,至少有一个以上的分数在80以上。运行以下命令...

db.people.createIndex({"sports" : 1, "grades" : 1})

...告诉我们不允许具有2个或更多数组字段的复合索引:

{
        "ok" : 0,
        "errmsg" : "cannot index parallel arrays [grades] [sports]",
        "code" : 10088
}

并行数组不能编入索引。 阵列值的每个组合(如足球,90),(足球,85),(篮球,55)等都需要进行索引,这很快导致索引大小爆炸。 在这个时间点上,MongoDb中不允许有2个或更多个数组的复合索引。

我们将在下一篇文章中的子文档中收录索引字段。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CsharpMongo/33.html