0

次の形式の mongodb コレクションにデータがあります。

{
    _id: ObjectId,
    Product: string,
    Modules: [
        {
            StaticModuleId: Int64,
            Set: [
                {
                    k: Int64,
                    v: {
                        Value: Double,
                        AnotherId: Int64


            }
            },
            ...
        ]
    }, 
    ...
]

}

MyIndex という名前のインデックスは次のとおりです。

{
    Product: 1,
    'Modules.StaticModuleId': 1,
    'Modules.Set.k': 1,
    'Modules.Set.v.Value': 1
}

コレクションには 5 つのドキュメントがあり、各セットには 10 個のモジュールと 100 個の要素があり、合計で 50 個のモジュールとセット内の 5000 個のエントリがあります。次に、次のクエリを実行しました。

{
    'Product': 'Test',
    $and: [
        {
            'Modules.StaticModuleId': 2010220,
            'Modules.Set': {
                $elemMatch: {
                    k: 41439,
                    'v.Value': 2186233
                }
            }
        },
        {
            'Modules.StaticModuleId': 2010226
        },
        {
            'Modules.StaticModuleId': 2010228
        }
    ]
}

.explain() は次のとおりです。

{
    cursor: 'BtreeCursor MyIndex',
    isMultiKey: true,
    n: 4,
    nscannedObjects: 941,
    nscanned: 941,
    nscannedObjectsAllPlans: 941,
    nscannedAllPlans: 941,
    scanAndOrder: false,
    indexOnly: false,
    nYields: 0,
    nChunkSkips: 0,
    millis: 52  
}

$elemMatch 句を追加し続けると、パフォーマンスが 200 ミリ秒を超えるまで低下します。このタイプのクエリはインデックス可能ですか? もしそうなら、パフォーマンスを向上させる方法についてのアイデアはありますか?

4

2 に答える 2

0

データモデルはあまり良くないと思います。これはモデルのような関係です。次のようにデータモデルをシンプルに変更できる場合:

{
  Product: "string",
  StaticModuleId: "string",
  Set:
  [
    {
      k: "string",
      v: 
      {
        Value: "double",
        AnotherId: "string"
      }
    }
  ]
}

パフォーマンスが向上し、複雑さが軽減されます

于 2013-04-24T10:53:03.027 に答える