我在MongoDB中有以下方案:
collection: records
{
"profile_id":int
"fields":[
{
"marc_ff":string
}
]
}
我想获得不同的fields.marc_ff值!
当我使用Eve的聚合功能(开发分支v0.7)时:
getuniquefields={
'datasource': {
'source': 'records',
'aggregation': {
'pipeline': [
{"$match": {
"profile_id":"$profile_value"
}},
{ "$unwind": "$fields" },
{ "$group": {
"_id": {"field_subfield":"$fields.marc_ff"},
}}
],
'options': {'allowDiskUse':True}
}
}
}
查询几乎 48秒(数千条记录)。
然而,当我使用PyMongo的distinct()函数时:
db.records.distinct('fields.marc_ff',{"profile_id":"$profile_value"})
30秒。
为什么它更快?
在第二种情况下,我正在初始化并验证Eve的run.py文件中的新MognoClient,但仍然快18秒。
Eve不支持(还)不同的聚合命令,但是为了获得不同的值,是否有更高效的实现?
更新
正如@Asya在评论中指出的那样,我在PyMongo的查询中添加了“profile_id”限制,所以现在查询是等价的,并且(奇怪地)不同甚至更快(从33secs到30secs)。
我应该提一下,目前我只收集了我的集合中一个profile_id的记录,因此两个查询必须考虑的记录是相同的(整个集合)。