Как MongoDB индексирует массивы?
в MongoDB, если бы я должен был хранить массив (скажем ["red", "blue"]
) в поле "color"
, это индекс "red"
и "blue"
Так что я мог бы запросить "red"
, например, или делает в make {"red", "blue"}
составной индекс?
2 ответа:
когда дело доходит до индексирования массивов, MongoDB индексирует каждое значение массива, чтобы вы могли запрашивать отдельные элементы, такие как "red."Например:
> db.col1.save({'colors': ['red','blue']}) > db.col1.ensureIndex({'colors':1}) > db.col1.find({'colors': 'red'}) { "_id" : ObjectId("4ccc78f97cf9bdc2a2e54ee9"), "colors" : [ "red", "blue" ] } > db.col1.find({'colors': 'blue'}) { "_id" : ObjectId("4ccc78f97cf9bdc2a2e54ee9"), "colors" : [ "red", "blue" ] }
для получения дополнительной информации ознакомьтесь с документацией MongoDB по Multikeys:http://www.mongodb.org/display/DOCS/Multikeys
вы можете просто проверить использование индекса, добавив "объяснить" к вашему запросу:
> db.col1.save({'colors': ['red','blue']}) # without index > db.col1.find({'colors': 'red'}).explain() { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "protrain.col1", "indexFilterSet" : false, "parsedQuery" : { "colors" : { "$eq" : "red" } }, "winningPlan" : { "stage" : "COLLSCAN", <--- simple column scan "filter" : { "colors" : { "$eq" : "red" } }, "direction" : "forward" }, "rejectedPlans" : [ ] }, "serverInfo" : { "host" : "bee34f15fe28", "port" : 27017, "version" : "3.4.4", "gitVersion" : "888390515874a9debd1b6c5d36559ca86b44babd" }, "ok" : 1 } # query with index > db.col1.createIndex( { "colors":1 } ) > db.col1.find({'colors': 'red'}).explain() { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "protrain.col1", "indexFilterSet" : false, "parsedQuery" : { "colors" : { "$eq" : "red" } }, "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", <!---- INDEX HAS BEEN USED "keyPattern" : { "colors" : 1 }, "indexName" : "colors_1", "isMultiKey" : true, "multiKeyPaths" : { "colors" : [ "colors" ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "colors" : [ "[\"red\", \"red\"]" ] } } }, "rejectedPlans" : [ ] }, "serverInfo" : { "host" : "bee34f15fe28", "port" : 27017, "version" : "3.4.4", "gitVersion" : "888390515874a9debd1b6c5d36559ca86b44babd" }, "ok" : 1 }
для структур, где у вас есть структурированные индексы, вы можете использовать позицию массива для индексирования полей внутри массивов:
{ '_id': 'BB167E2D61909E848EBC96C7B33251AC', 'hist': { 'map': { '10': 1 } }, 'wayPoints': [{ 'bhf_name': 'Zinsgutstr.(Berlin)', 'ext_no': 900180542, 'lat': 52.435158, 'lon': 13.559086, 'puic': 86, 'time': { 'dateTime': '2018-01-10T09: 38: 00', 'offset': { 'totalSeconds': 3600 } }, 'train_name': 'Bus162' }, { 'bhf_name': 'SAdlershof(Berlin)', 'ext_no': 900193002, 'lat': 52.435104, 'lon': 13.54055, 'puic': 86, 'time': { 'dateTime': '2018-01-10T09: 44: 00', 'offset': { 'totalSeconds': 3600 } }, 'train_name': 'Bus162' }] } db.col.createIndex( { "wayPoints.0.ext_no":1 } ) db.col.createIndex( { "wayPoints.0.train_name":1 } ) db.col.createIndex( { "wayPoints.1.ext_no":1 } ) db.col.createIndex( { "wayPoints.1.train_name":1 } ) > db.col.find( ... { ... "wayPoints.ext_no": 900180542 ... } ... , ... { ... "wayPoints.ext_no":1, ... "wayPoints.train_name":1, ... "wayPoints.time":1 ... } ... ).explain() { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "db.col", "indexFilterSet" : false, "parsedQuery" : { "wayPoints.ext_no" : { "$eq" : 900180542 } }, "winningPlan" : { "stage" : "PROJECTION", "transformBy" : { "wayPoints.ext_no" : 1, "wayPoints.train_name" : 1, "wayPoints.time" : 1 }, "inputStage" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "wayPoints.ext_no" : 1 }, "indexName" : "wayPoints.ext_no_1", "isMultiKey" : true, "multiKeyPaths" : { "wayPoints.ext_no" : [ "wayPoints" ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "wayPoints.ext_no" : [ "[900180542.0, 900180542.0]" ] } } } }, "rejectedPlans" : [ ] }, "serverInfo" : { "host" : "bee34f15fe28", "port" : 27017, "version" : "3.4.4", "gitVersion" : "888390515874a9debd1b6c5d36559ca86b44babd" }, "ok" : 1 }