Mongodb сложные регулярные выражения - PullRequest
0 голосов
/ 09 января 2012

У меня есть коллекция таких городов

{ "name": "something","population":2121}

В одной коллекции есть тысячи таких документов

, теперь я создал такой индекс

$coll->ensureIndex(array("name" => 1, "population" => -1), 
                   array("background" => true));

сейчас я хочу запросить вот так

$cities = $coll->find(array("name" => array('$regex' => "^$name")))
              ->limit(30)
              ->sort(array("name" => 1, "population" => -1));

Но это возвращает города в порядке возрастания населения.Но я хочу, чтобы результат был в порядке убывания населения, т.е.

Любая идея ???

РЕДАКТИРОВАТЬ: я создал отдельные индексы по имени и населению.Ниже приводится вывод db.city_info.getIndexes () и db.city_info.find ({"name": {"$ regex": "^ Ban"}}). Sort ({"population": -1}). Объяснить();соответственно

[
{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "ns" : "city_database.city_info",
    "name" : "_id_"
},
{
    "v" : 1,
    "key" : {
        "name" : 1
    },
    "ns" : "city_database.city_info",
    "background" : 1,
    "name" : "ascii_1"
},
{
    "v" : 1,
    "key" : {
        "population" : 1
    },
    "ns" : "city_database.city_info",
    "background" : 1,
    "name" : "population_1"
}
]

и

{
"cursor" : "BtreeCursor ascii_1 multi",
"nscanned" : 70739,
"nscannedObjects" : 70738,
"n" : 70738,
"scanAndOrder" : true,
"millis" : 17461,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
    "name" : [
        [
            "Ban",
            "Bao"
        ],
        [
            /^Ban/,
            /^Ban/
        ]
    ]
}
}

Просто посмотрите на время, затраченное на запрос: - (

1 Ответ

1 голос
/ 09 января 2012

Если вы хотите, чтобы результаты были в порядке убывания населения (от наибольшего к наименьшему), удалите сортировку по имени в запросе.

my слишком короткое, имеет правильное представление

Когда вы сортируете по имени, а затем по убыванию населения, то, что у вас есть сейчас, оно сортирует по имени, что, скорее всего, уникально, потому что мы говорим о городах, а затем по населению.

Кроме того, убедитесь, что выиметь индекс на имя:

db.cities.ensureIndex({population: 1})

Направление не имеет значения, когда индекс находится на одном поле.

Обновление (образец аналогичного индекса,запрос и объяснение):

> db.test.insert({name: "New York", population: 5000})
> db.test.insert({name: "Longdon", population: 7000})
> db.test.ensureIndex({name: 1})
> db.test.find({name: {"$regex": "^New"}}).sort({poplation: -1})
{ "_id" : ObjectId("4f0ff70072999b69b616d2b6"), "name" : "New York", "population" : 5000 }
> db.test.find({name: {"$regex": "^New"}}).sort({poplation: -1}).explain()
{
"cursor" : "BtreeCursor name_1 multi",
"nscanned" : 1,
"nscannedObjects" : 1,
"n" : 1,
"scanAndOrder" : true,
"millis" : 1,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
    "name" : [
        [
            "New",
            "Nex"
        ],
        [
            /^New/,
            /^New/
        ]
    ]
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...