MongoDB-解释特定的解释输出
我使用的是MongoDB版本2.4.8MongoDB-解释特定的解释输出,mongodb,indexing,Mongodb,Indexing,我使用的是MongoDB版本2.4.8 [test] 2014-03-25 14:42:13.0 >>> db.users.getIndexes(); [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.users",
[test] 2014-03-25 14:42:13.0 >>> db.users.getIndexes();
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "test.users",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"username" : 1,
"age" : 1
},
"ns" : "test.users",
"name" : "username_1_age_1"
},
{
"v" : 1,
"key" : {
"age" : 1,
"username" : 1
},
"ns" : "test.users",
"name" : "age_1_username_1"
}
]
[test] 2014-03-25 14:44:36.550 >>>
[test] 2014-03-25 14:33:12.945 >>> db.users.find({"age" : 14, "username" : /.*/}).explain()
{
"cursor" : "BtreeCursor age_1_username_1 multi",
"isMultiKey" : false,
"n" : 16850,
"nscannedObjects" : 16850,
"nscanned" : 16850,
"nscannedObjectsAllPlans" : 16850,
"nscannedAllPlans" : 16850,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 86,
"indexBounds" : {
"age" : [
[
14,
14
]
],
"username" : [
[
"",
{
}
],
[
/.*/,
/.*/
]
]
},
"server" : "server01:27017"
}
explain输出在其username
部分中的含义是什么
"username" : [
[
"",
{
}
],
[
/.*/,
/.*/
]
]
我很难理解这个部分否如果我以正式和非正式的方式查看它,这很重要。那里的输出是特定于未绑定到字符串起始位置的正则表达式的。因此,对于要扫描索引而不是集合的正则表达式(即使在本例中它将扫描整个索引),需要有一组起始边界和结束边界: 考虑使用不同正则表达式的第一个查询:
db.collection.find({“username”:/bob/}).explain()
“指数边界”:{
“用户名”:[
[
"",
{
}
],
[
/鲍勃/,,
/鲍勃/
]
]
},
这意味着整个字符串中都有一个字符串需要搜索,然后匹配将以包含“bob”作为字符串一部分的内容结束。因此,第一部分是“词汇”匹配边界,第二部分是要应用的实际正则表达式:
以下查询更清楚地显示了这一点:
db.collection.find({username://^bob/}).explain()
“指数边界”:{
“用户名”:[
[
“鲍勃”,
“中国银行”
],
[
/^鲍勃/,,
/^鲍勃/
]
]
},
因为它被锚定到字符串的开头,所以需要测试的索引的唯一条目在“bob”和“boc”之间“词汇上”匹配。正则表达式再次包含为边界的第二部分
边界项通常在内部被描述为“两部分”元素,正则表达式就是这种情况,在第一部分中,正则表达式具有字符串边界,这对于匹配索引是有意义的,然后正则表达式应用于那些匹配的entires
最后,请参见以下内容:
db.collection.find({username:{$gt:}}).explain()
“指数边界”:{
“用户名”:[
[
"",
{
}
]
]
},
这本质上与初始查询相同,即匹配任何字符串。不是真正的答案,但为什么要查询“匹配所有内容”regexp?听起来你可以使用
$exists
或$type
来查询“has a username”或“has a username that a string”。@Avish这只是我在一本书中找到的一个例子。非常糟糕的例子-你确定这不是一个无关的例子吗?匹配所有内容的正则表达式将无法有效地使用任何索引。@AsyaKamsky糟糕还是不错,我不知道。第101页此处:我们了解您正在阅读这本书(您已经发布了一些相关问题),但我的回答(最后一点)强调了此处提出的两点,即解释输出的第一部分反映了给定查询的“匹配所有内容”性质。答案进一步解释了为什么有这种特殊的形式用于“regex”操作。如果你真的有问题,就在答案上问他们。但解释应该非常清楚。试着对Asya“友善”。她是MongoDB的“枪”故障排除者之一。也许有一天你会需要她。尼尔,我接受了你的回答。前几天我读了两遍,都不太明白。当我有更多的时间时,我会详细阅读它。谢谢。@peter.petrov不太确定你“不懂”哪一部分。各种各样的例子都很清楚。1.)正则表达式查询将对索引条件强制执行第二个“边界”。这些是regex术语,重复,因为这就是所用结构的性质。2.)一个开放的“匹配字符串中的任何内容”条件有一个“边界”条件,即任何作为字符串的内容与非字符串的内容(也称为对象)之间的“边界”条件。所有这些都清楚地显示出来。你还没有在这件事上判给赏金。如果这是你第一次,我可以说,你得不到分数。那是浪费:)我应该赏金吗?我想当我把这个标记为正确答案时,这些分数会转移给你。让我查一查。