0

mongodb に次のような配列構造がある場合:

"field":
[
     [10,20]  //specified length per array
     [25,40]
     [60,90]
     ...and so on, with various size per document
]

このサブアレイにインデックスを付けるにはどうすればよいですか? インデックスを作成しようとしました: db.ensureIndex({"field.$.0":1}); //そして {"field.$.1":1}

しかし、ドキュメントの検索は遅いままです。

私もこの解決策を試しました: MongoDB、配列インデックスの配列です が、

db.ensureIndex("{field:[{"a":1}]}"); //and "{field:[{"b":1}]}" 

サブ配列のインデックス a および b に名前を付ける場合、このシンタックスは「不適切なインデックス キー パターン」例外をスローします。

4

1 に答える 1

3

あなたがやろうとしていることをもっと説明できますか?最初のスキーマ設計はあまり良くありません。非常に遅くなる可能性のある配列演算子を使用する以外に、実際に対処する方法がない配列がたくさんあります。

2 番目のアイデアは順調に進んでいるようですが、構文が少しずれています。サブ配列の代わりにドキュメントを挿入できれば、スキーマの扱いがはるかに簡単になり、以下に示すように各ドキュメントの 2 つの値にインデックスを付けることができます。

> db.test.insert({field: [{a:1, b:2}, {a:3, b:4}]})
> db.test.ensureIndex({"field.a":1})
> db.test.ensureIndex({"field.b":1})
> db.test.getIndexes()
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "test.test",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "field.a" : 1
                },
                "ns" : "test.test",
                "name" : "field.a_1"
        },
        {
                "v" : 1,
                "key" : {
                        "field.b" : 1
                },
                "ns" : "test.test",
                "name" : "field.b_1"
        }
]
> db.test.find({"field.a": 3})
{ "_id" : ObjectId("520e2ec749177daf439a2ff6"), "field" : [ { "a" : 1, "b" : 2 }, { "a" : 3, "b" : 4 } ] }

Explain を実行して、実際にインデックスが使用されていることを確認できます (カーソル行を参照)。

> db.test.find({"field.a": 3}).explain()
{
        "cursor" : "BtreeCursor field.a_1",
        "isMultiKey" : true,
        "n" : 1,
        "nscannedObjects" : 1,
        "nscanned" : 1,
        "nscannedObjectsAllPlans" : 1,
        "nscannedAllPlans" : 1,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 0,
        "indexBounds" : {
                "field.a" : [
                        [
                                3,
                                3
                        ]
                ]
        },
        "server" : "xxxxx-PC:27017"
}
于 2013-08-16T13:55:03.313 に答える