我正在尝试从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中生成上述文档?