0

製品コレクションに3つのドキュメントがあります。

samsung = {
  title: 'Samsung Galaxy S III',
  category_id: ObjectId("50bcc2f0b910a6c1936a4424"),
  properties: [
    {
      title: 'OS',
      value: 'Android'
    },
    {
      title: 'Display',
      value: '4.8"'
    }
  ]
}

htc = {
  title: 'HTC One X',
  category_id: ObjectId("50bcc2f0b910a6c1936a4424"),
  properties: [
    {
      title: 'OS',
      value: 'Android'
    },
    {
      title: 'Display',
      value: '4.7"'
    }
  ]
}

apple = {
  title: 'Apple iPhone 5',
  category_id: ObjectId("50bcc2f0b910a6c1936a4424"),
  properties: [
    {
      title: 'OS',
      value: 'iOS'
    },
    {
      title: 'Display',
      value: '4"'
    }
  ]
}

およびインデックス{category_id: 1, 'properties.title': 1, 'properties.value': 1}

インデックスは次のようになります。

ObjectId("50bcc2f0b910a6c1936a4424")
  OS
    Android
      samsung
      htc
    iOS
      apple
  Display
    4.8"
      samsung
    4.7"
      htc
    4"
      apple

そして、私はそのクエリを期待しています:

{
  category_id: ObjectId("50bcc2f0b910a6c1936a4424"),
  properties: {
    $elemMatch: {
      title: 'OS',
      value: 'Android'
    }
  }
}

nscanned == 2、nscannedObjects == 2、n == 2.しかし、私はそのような出力を次のように取得しますexplain()

{
        "cursor" : "BtreeCursor category_id_1_properties.title_1_properties.value_1",
        "nscanned" : 3,
        "nscannedObjects" : 3,
        "n" : 2,
        "millis" : 0,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "isMultiKey" : true,
        "indexOnly" : false,
        "indexBounds" : {
                "category_id" : [
                        [
                                ObjectId("50bcc2f0b910a6c1936a4424"),
                                ObjectId("50bcc2f0b910a6c1936a4424")
                        ]
                ],
                "properties.title" : [
                        [
                                "OS",
                                "OS"
                        ]
                ],
                "properties.value" : [
                        [
                                {
                                        "$minElement" : 1
                                },
                                {
                                        "$maxElement" : 1
                                }
                        ]
                ]
        }
}

indexBoundsなぜそうで"properties.value"はないのか説明してもらえます["Android","Android"]か?

インデックスを使用して適切な電話を取得するために、クエリを書き直したり、インデックスを再構築したりできますか?

4

1 に答える 1

1

これはMongoDBのバグです:https ://jira.mongodb.org/browse/SERVER-3104 。

開発バージョン2.3.1にも同じバグがありますが、最新のナイトリービルド(2012-12-03でテスト済み)では、すべてが正常に機能しているようです。

于 2012-12-03T18:04:07.277 に答える