Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB-解释特定的解释输出_Mongodb_Indexing - Fatal编程技术网

MongoDB-解释特定的解释输出

MongoDB-解释特定的解释输出,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",

我使用的是MongoDB版本2.4.8

[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.)一个开放的“匹配字符串中的任何内容”条件有一个“边界”条件,即任何作为字符串的内容与非字符串的内容(也称为对象)之间的“边界”条件。所有这些都清楚地显示出来。你还没有在这件事上判给赏金。如果这是你第一次,我可以说,你得不到分数。那是浪费:)我应该赏金吗?我想当我把这个标记为正确答案时,这些分数会转移给你。让我查一查。