如何在pymongo翻译组mongo

时间:2015-12-06 15:47:37

标签: python mongodb

我正在尝试从mongo中检索文档,如下所示:

{"data":[{
    "results":{
        "user_id":"1234",
        "user_type": "A",
        "user_name": "Brian Johanson",
        "city":"Winnipeg",
        "count":{
            "id": 2,
            "file_id": 14
        }
    }
}]
}

我有一个在mongo shell中工作的版本,但是在Python中可以获得同样的功能,这就是问题所在。

我对mongo很新,但基本上我正在努力做mongo相当于:

SELECT user_id, max(user_type), max(user_name), MAX(city), count(id), count(file_id), count(*) from userlogs where event_time<1948306176 and event_time> 1048306176 group by user_id

我使用群组和聚合手动在mongo中手动执行此操作一段时间,但最终使用在线翻译生成此内容:

db.user.group({
"key": {
    "user_id": true
},
"initial": {
    "countid": 0,
    "countfile_id": 0,
    "countstar": 0
},
"reduce": function(obj, prev) {
    prev.maximumvalueuser_type = isNaN(prev.maximumvalueuser_type) ? obj.user_type : Math.max(prev.maximumvalueuser_type, obj.user_type);
    prev.maximumvalueuser_name = isNaN(prev.maximumvalueuser_name) ? obj.user_name : Math.max(prev.maximumvalueuser_name, obj.user_name);
    prev.maximumvaluecity = isNaN(prev.maximumvaluecity) ? obj.city : Math.max(prev.maximumvaluecity, obj.city);
    if (obj.id != null) if (obj.id instanceof Array) prev.countid += obj.id.length;
    else prev.countid++;
    if (obj.file_id != null) if (obj.file_id instanceof Array) prev.countfile_id += obj.file_id.length;
    else prev.countfile_id++;
    if (true != null) if (true instanceof Array) prev.countstar += true.length;
    else prev.countstar++;
},
"cond": {
    "event_time": {
        "$lt": 1948306176,
        "$gt": 1048306176
    }
}

});

这似乎在mongo shell中产生了上述文档,但我需要在Python中使用它。

我尝试了几种变体:

group_key = """{
    "user_id": true
}"""
group_initial = """{
    "countid": 0,
    "countfile_id": 0,
    "countstar": 0
}"""
group_reduce = """function(obj, prev) {
    prev.maximumvalueuser_type = isNaN(prev.maximumvalueuser_type) ? obj.user_type : Math.max(prev.maximumvalueuser_type, obj.user_type);
    prev.maximumvalueuser_name = isNaN(prev.maximumvalueuser_name) ? obj.user_name : Math.max(prev.maximumvalueuser_name, obj.user_name);
    prev.maximumvaluecity = isNaN(prev.maximumvaluecity) ? obj.city : Math.max(prev.maximumvaluecity, obj.city);
    if (obj.id != null) if (obj.id instanceof Array) prev.countid += obj.id.length;
    else prev.countid++;
    if (obj.file_id != null) if (obj.file_id instanceof Array) prev.countfile_id += obj.file_id.length;
    else prev.countfile_id++;
    if (true != null) if (true instanceof Array) prev.countstar += true.length;
    else prev.countstar++;
}"""
group_cond = """{
    "event_time": {
        "$lt": 1948306176,
        "$gt": 1048306176
    }
}"""
all_events = db["userlogs"].group(key=group_key, initial=group_initial, reduce=group_reduce, condition=group_cond)

然而,这导致&#34;失败:初始必须是一个对象。&#34;

如何在Python中生成上述文档?

0 个答案:

没有答案