У меня есть коллекция с геопространственными данными (2dsphere) и временными метками (дата), которые мне нужно запросить на основе местоположения (т. Е. Геопространственных) и времени (т. Е. Даты).
Я создал составной индекс с геопространственные и время как индикаторы. Однако, когда я выполняю запрос (т.е. на основе местоположения и времени), планировщик запросов говорит, что он выполняет COLLSCAN.
Кроме того, когда я добавляю индекс только со временем, он использует этот индекс (ie. IXSCAN с индекс отметки времени).
Я немного запутался, я читал, что вы должны иметь возможность использовать 2dsphere и отметку времени в качестве составного индекса для быстрого поиска на основе местоположения и времени (например, Индексирование MongoDB: Несколько в одном поле против одного соединения? ).
Итак, я предполагаю, что мой вопрос заключается в том, возможно ли использовать 2dsphere в качестве составного индекса? Индекс 2dsphere ведет себя так же, как и другие типы индексов (например, целые числа, даты и т. Д. 1032 *), или есть большие различия? Например, предположим, что у нас есть признаки "timestamp", "geospatial" (в указанном порядке индексов). Могу ли я запрашивать только на основе timestamp (так как это первый индекс)?
Ссылка на документы о 2dsphere: https://docs.mongodb.com/manual/core/2dsphere/.
Заранее спасибо.
Пример данных:
{
"_id" : ObjectId("5e300c9673f256100d5ca0b2"),
"geometry" : {
"type" : "Point",
"coordinates" : [
18.2,
59.8
]
},
"properties" : {
"@timestamp" : ISODate("2019-01-01T12:01:00.158Z")
}
}
{
"_id" : ObjectId("5e300c9673f256100d5ca0b3"),
"geometry" : {
"type" : "Point",
"coordinates" : [
12.3,
52.4
]
},
"properties" : {
"@timestamp" : ISODate("2019-01-01T12:10:00.158Z")
}
}
{
"_id" : ObjectId("5e300c9673f256100d5ca0b4"),
"geometry" : {
"type" : "Point",
"coordinates" : [
28.8,
50.2
]
},
"properties" : {
"@timestamp" : ISODate("2019-01-01T12:50:00.158Z")
}
}
{
"_id" : ObjectId("5e300c9673f256100d5ca0b5"),
"geometry" : {
"type" : "Point",
"coordinates" : [
28.8,
50.2
]
},
"properties" : {
"@timestamp" : ISODate("2019-01-01T13:50:00.158Z")
}
}
{
"_id" : ObjectId("5e300c9673f256100d5ca0af"),
"geometry" : {
"type" : "Point",
"coordinates" : [
-102.5,
22.6
]
},
"properties" : {
"@timestamp" : ISODate("2019-01-01T12:01:00.158Z")
}
}
{
"_id" : ObjectId("5e300c9673f256100d5ca0b0"),
"geometry" : {
"type" : "Point",
"coordinates" : [
-104.5,
21
]
},
"properties" : {
"@timestamp" : ISODate("2019-01-01T12:10:00.158Z")
}
}
{
"_id" : ObjectId("5e300c9673f256100d5ca0b1"),
"geometry" : {
"type" : "Point",
"coordinates" : [
-104.5,
21
]
},
"properties" : {
"@timestamp" : ISODate("2019-01-01T13:10:00.158Z")
}
}
Индекс:
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test_database.map_reduce_test_data"
},
{
"v" : 2,
"key" : {
"properties.@timestamp" : -1,
"geometry" : "2dsphere"
},
"name" : "properties.@timestamp_-1_geometry_2dsphere",
"ns" : "test_database.map_reduce_test_data",
"2dsphereIndexVersion" : 3
}
Запрос:
db.map_reduce_test_data.find({"properties.@timestamp": { $gt: new Date("2019-01-01T12:00:00Z"), $lt: new Date("2019-01-01T13:00:00Z") }})
Объяснить результат:
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test_database.map_reduce_test_data",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"properties.@timestamp" : {
"$lt" : ISODate("2019-01-01T13:00:00Z")
}
},
{
"properties.@timestamp" : {
"$gt" : ISODate("2019-01-01T12:00:00Z")
}
}
]
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"$and" : [
{
"properties.@timestamp" : {
"$lt" : ISODate("2019-01-01T13:00:00Z")
}
},
{
"properties.@timestamp" : {
"$gt" : ISODate("2019-01-01T12:00:00Z")
}
}
]
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"ok" : 1
}