Regex Mongodb复杂正则表达式查询

Regex Mongodb复杂正则表达式查询,regex,mongodb,indexing,Regex,Mongodb,Indexing,我收集了很多这样的城市 { "name": "something","population":2121} $coll->ensureIndex(array("name" => 1, "population" => -1), array("background" => true)); 在一个集合中有数千个这样的文档 现在,我创建了如下索引 { "name": "something","population":2121} $col

我收集了很多这样的城市

{ "name": "something","population":2121}
$coll->ensureIndex(array("name" => 1, "population" => -1), 
                   array("background" => true));
在一个集合中有数千个这样的文档

现在,我创建了如下索引

{ "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”})的输出;分别

[
{
    "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"
}
]


只需查看查询所花费的时间:-(

如果您希望结果按总体降序排列(从大到小),请删除查询中的按名称排序

我的头发太短,我的想法是对的

当你按名字排序,然后按人口递减,你现在拥有的,它按名字排序,这很可能是独一无二的,因为我们谈论的是城市,然后是人口

此外,请确保您在名称上有索引:

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/
        ]
    ]
}
}

为什么要索引
name
并查询
asciiname
?对不起,现在我发布了正确的东西。那个asciiname是错误的。它只是名称…样本数据{“name”:“London”,“population”:121212}{“name”:“New York”,“population”:1212232}如果我删除了对名称的排序,它就不会使用索引-(这是因为您只需要在总体上创建索引,而在名称和总体上创建的索引对正确的查询没有帮助。如果我不在名称上创建索引,则该正则表达式查询将不会使用索引。您的意思是我应该为名称和总体创建不同的索引吗?我从explain获得了类似的输出(请参阅上面的更新)。但是,您的NSCaned似乎非常高,您确定您的正则表达式与大量文档不匹配吗?您正在运行哪个版本?集合中有多少文档。可能只是您没有足够的内存来保存工作集。您有多少ram?集合的大小是多少?db.cities.stats()--请在上面张贴输出