使用Eve聚合获取不同的值比PyMongo的collection.distinct()

时间:2017-02-01 00:05:15

标签: mongodb pymongo aggregation-framework eve

我在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的记录,因此两个查询必须考虑的记录是相同的(整个集合)。

0 个答案:

没有答案