【问题标题】:MongoDB - interpret particular explain outputMongoDB - 解释特定的解释输出
【发布时间】:2014-03-25 18:46:12
【问题描述】:

我使用的是 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"
}

解释输出在其username 部分中的含义是什么?

            "username" : [
                    [
                            "",
                            {

                            }
                    ],
                    [
                            /.*/,
                            /.*/
                    ]
            ]

我无法理解这部分否
不管我是正式还是非正式地看待它。

【问题讨论】:

  • 不是一个真正的答案,但您为什么要查询“匹配所有内容”正则表达式?听起来您可以使用$exists$type 来查询“有用户名”或“有一个字符串的用户名”。
  • @Avish 这只是我在书中找到的一个例子。
  • 非常糟糕的例子——你确定这不是无关的例子吗?无论如何,匹配所有内容的正则表达式都无法有效地使用任何索引。
  • @AsyaKamsky 糟糕还是美好,我不知道。第 101 页:shop.oreilly.com/product/0636920028031.do
  • 我们知道您正在阅读这本书(您已经发布了几个引用此问题的问题),但是这里提出的两点在我的回答(最后一点)中突出显示,即解释的第一部分输出反映了给定查询的“匹配一切”性质。答案进一步解释了为什么这种特殊形式用于“正则表达式”操作。如果你真的有问题,就问他们的答案。但是解释应该很清楚。试着对Asya“好”。她是 MongoDB 的“枪支”疑难解答者之一。有一天你可能需要她。

标签: mongodb indexing


【解决方案1】:

那里的输出特定于未绑定到字符串起始位置的正则表达式。因此,对于要扫描索引而不是集合的正则表达式(即使在这种情况下它将扫描整个索引),需要一组起始边界和结束边界:

考虑使用不同正则表达式的第一个查询:

db.collection.find({ "username": /bob/ }).explain()

    "indexBounds" : {
            "username" : [
                    [
                            "",
                            {

                            }
                    ],
                    [
                            /bob/,
                            /bob/
                    ]
            ]
    },

这表示有一个要搜索的整个字符串,然后匹配将在包含“bob”作为字符串一部分的内容上结束。所以第一部分是“词法”匹配范围,第二部分是要应用的实际正则表达式:

以下查询更清楚地说明了这一点:

db.collection.find({ username: /^bob/ }).explain()

    "indexBounds" : {
            "username" : [
                    [
                            "bob",
                            "boc"
                    ],
                    [
                            /^bob/,
                            /^bob/
                    ]
            ]
    },

由于它被锚定到字符串的开头,因此需要测试的唯一索引条目在“bob”和“boc”之间“按词法”匹配。正则表达式再次被包含为边界的第二部分。

边界条目通常在内部被描述为“两部分”元素,正则表达式存在这种情况,在第一部分有字符串边界,这对于匹配索引是有意义的,然后是正则表达式应用到那些匹配的整体。

最后,请参阅以下内容:

db.collection.find({ username: {$gt: ""} }).explain()

    "indexBounds" : {
            "username" : [
                    [
                            "",
                            {

                            }
                    ]
            ]
    },

这本质上与您的初始查询相同,即匹配 any 字符串。

【讨论】:

  • 尼尔,我接受了你的回答。前几天看了两遍,没看懂。当我有更多时间时,我会详细阅读它。谢谢。
  • @peter.petrov 不太确定你“没有得到”哪一部分。各种例子都很清楚。 1.) 正则表达式查询将在索引条件上强制设置第二个“边界”。这些是正则表达式术语,重复,因为这是所使用的结构的性质。 2.) 一个开放的“匹配字符串中的任何内容”条件具有任何 作为字符串到 不是 字符串(又名对象)的任何内容的“边界”条件.所有这些都清楚地显示出来。您还没有为此获得赏金。如果这是你第一次,我可以说,你不会拿回积分。所以那将是一种浪费:)
  • 我应该奖励赏金吗?我想当我将此标记为正确答案时,这些分数将转移给您。让我检查一下。
猜你喜欢
  • 2017-09-09
  • 2023-03-18
  • 2012-05-19
  • 2014-02-17
  • 2011-05-03
  • 2012-02-17
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多