我需要对整个集合进行区分大小写的排序,这是mongoengine做不到的,因为mongodb只有区分大小写的排序。在
所以我有个办法。获取集合中的所有条目,然后在python中执行我自己的unicode不区分大小写的排序。但是我的藏书量非常大,所以延迟太久也有问题。有没有办法,怎么做得更快?在
def initMongoengineData(model, criteria, only):
if model == None:
return
print "-- starting DB query"
print datetime.datetime.now()
querySet = model.objects(**criteria).only(*only)
print "-- data loaded"
print datetime.datetime.now()
return mongoengineQuerySetToList(querySet)
def mongoengineQuerySetToList(querySet):
queryList = []
dict = {}
objDict = None
objCounter = 0
for obj in querySet:
objCounter += 1
dict = {}
objDict = obj.to_mongo()
for key in objDict:
dict[key] = objDict[key]
queryList.append(dict)
print "-- structure for sorting is ready"
print datetime.datetime.now()
print "-- number of objects:"
print objCounter
queryList.sort(key=lambda x: x['surname'].lower())
print "-- structure is sorted"
print datetime.datetime.now()
return queryList
model = Players # mongoengine Document
criteria = {}
only = ['surname']
datalist = initMongoengineData(model, criteria, only)
输出:
^{pr2}$之后的数据加载和排序非常快,但是准备排序结构大约需要1分钟这是非常长的延迟。有人能帮助如何更快地完成这项工作吗?在
您只需要按一个字段排序(
surname
在本例中)。在所以使用mongoengine
model.objects(**criteria).only(*only).order_by('+surname')
进行基排序(排序)请参见http://docs.mongoengine.org/en/latest/guide/defining-documents.html#ordering。在但是如果你真的需要不区分大小写的排序,没有简单的方法。在
在您的代码中,最慢的块是
for obj in querySet
。在这个块中,您可以从查询集中获取项。您可以尝试使用for obj in list(querySet)
一次获取所有数据,但我不认为它真的能提高性能。在最好的方法是用小写添加附加字段。你也可以试试map reduce。我不知道如何用aggregation来实现这一点。在
另外,不区分大小写的索引也将在mongo2.5.w上(可能在11月底)见https://jira.mongodb.org/browse/SERVER-90。在
相关问题 更多 >
编程相关推荐