0

Pythonでmongoengineを使用しています。モデルを宣言するために、次のコードがあります。

class Subject(Document):
    uri = StringField(required=True,unique=True)
    resources = ListField(ReferenceField('Resource'))
    meta = {
        'indexes': [
            {'fields': ['uri'], 'unique': True},
        ],
    }

インデックスが作成されているか、期待どおりに機能していることを確認したかったので、mongo に移動して実行しました。

db.subject.find({uri:' http://dbpedia.org/resource/Napoleon '}).explain()

そのコマンドの出力は次のとおりです。

{
    "cursor" : "BtreeCursor uri_1",
    "isMultiKey" : false,
    "n" : 1,
    "nscannedObjects" : 1,
    "nscanned" : 1,
    "nscannedObjectsAllPlans" : 1,
    "nscannedAllPlans" : 1,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
        "uri" : [
            [
                "http://dbpedia.org/resource/Napoleon",
                "http://dbpedia.org/resource/Napoleon"
            ]
        ]
    },
    "server" : "ioannis-linux:27017",
    "filterSet" : false
}

mongodb docs を見て理解できないのは、なぜ同じ uri インデックスの 2 つのエントリを に取得するのindexBoundsかということです。これはどういう意味ですか? これは、検索するすべての URI で発生します。

アップデート

これが関連しているかどうかはわかりませんが、同じ URI をインデックスとして使用している別のドメイン クラスもあります..( Resource)

4

2 に答える 2

3

説明はとても簡単です。それらは境界です-下限と上限。それらが等しい場合、正確な文字列を検索しています。

次のようなこともできます

db.subject.find({uri: { $gte: 'http://dbpedia.org/resource/Napoleon', 
                        $lte: 'http://dbpedia.org/resource/Putin' 
                }).explain() 

(あなたの場合はあまり意味がありませんが、他の場所では役立つかもしれません)、これにより異なる境界が生じ、したがって範囲の結果が得られます。

この背後にある理由は単純化にあると思います。完全一致検索と範囲検索を記述するために異なるフィールドを用意する代わりに、この方法で両方を表現できます。

于 2015-04-10T10:45:25.360 に答える
1

uri に一意のインデックスがあり、そのインデックスで単一のドキュメントをクエリするため、これはごく普通のことです。Explain の indexBounds は、この特定のドキュメントを取得するために、このインデックスの [lower, upper] 境界から始まるインデックスをスキャンしたことを示しています。nscanned = 1 もこれを検証します。

異なる境界を見たい場合は、正規表現を次のように指定してクエリを試してください。{uri: {$regex:'^"http://dbpedia*'}} おそらく、より多くのドキュメントをスキャンする必要があり、explain() で異なる [上限、下限] 境界が得られます。

于 2015-04-10T10:52:54.740 に答える