недавно у меня возникла простая проблема: я могу использовать скрипты монго, чтобы использовать mapreduce для объединения двух коллекций. В то время как со сценариями pymongo, это не работает.
Согласно документации pymongo, есть две опции: redu_output which и merge_output для функции map_reduce ():
redu_output (необязательно) УСТАРЕЛО: если для заданного ключа в наборе результатов и в существующей выходной коллекции существуют документы, то операция уменьшения (с использованием указанной функции сокращения) будет выполнена для двух значений, и результат будет записывается в выходную коллекцию. Игнорируется, если out не является экземпляром basestring.
merge_output (необязательно) DEPRECATED: объединить вывод в out. Если один и тот же ключ существует как в наборе результатов, так и в существующей выходной коллекции, новый ключ перезапишет существующий ключ. Игнорируется, если out не является экземпляром basestring.
Но из моего эксперимента, это, вероятно, не работает. Кто-нибудь может помочь с этими двумя вариантами? Большое спасибо.
# pymongo
mapTotalTimeListened = Code("function(){emit(this._id, {totalTimeListened: this.value1.totalTimeListened});}")
mapTimeListened = Code("function(){emit(this._id, {radio:this.value2.radio, timeListened: this.value2.timeListened});}")
reduceJoin = Code("function(key, values){
var tmps = [];
var results = {};
values.forEach(function(v){
var out = {};
if(v.radio !== undefined )out['radio'] = v.radio;
if(v.timeListened !== undefined ) out['timeListened'] = v.timeListened;
if(v.totalTimeListened !== undefined ) out['totalTimeListened'] = v.totalTimeListened;
if(Object.keys(out).length > 0) tmps.push(out);
});
if(Object.keys(tmps).length > 0) results['fucks'] = tmps;
return results;}")
db.result1.map_reduce(mapTotalTimeListened, reduceJoin, 'joinedTest2',reduce_output=True, merge_output=True)
db.result2.map_reduce(mapTimeListened, reduceJoin,"joinedTest2", reduce_output=True, merge_output = True)
// js script
var db = connect('127.0.0.1:27017/local');
mapTotalTimeListened = function(){
emit(this._id, {totalTimeListened: this.value1.totalTimeListened});}
mapTimeListened = function(){
emit(this._id, {radio:this.value2.radio, timeListened: this.value2.timeListened});}
reduceFine = function(key, values){
var tmps = [];
var results = {};
values.forEach(function(v){
var out = {};
if(v.radio !== undefined )out['radio'] = v.radio;
if(v.timeListened !== undefined ) out['timeListened'] = v.timeListened;
if(v.totalTimeListened !== undefined ) out['totalTimeListened'] = v.totalTimeListened;
if(Object.keys(out).length > 0) tmps.push(out);
});
if(Object.keys(tmps).length > 0) results['fucks'] = tmps;
return results;
}
db.result1.mapReduce(mapTotalTimeListened, reduceFine, {out : {reduce:'joinedRes'}});
db.result2.mapReduce(mapTimeListened, reduceFine, {out : {reduce:'joinedRes'}});
inputcollection result1:
{'_id': {'_id': ObjectId('5cb743e78447b053746613b5'),
'country': 'America',
'first_name': 'pnklbxzojo',
'gender': 1,
'last_name': 'gnzdollddp',
'vehicule': 'Ford Flex'},
'value1': {'totalTimeListened': 690238990000.0}}
inputcollection result2:
{'_id': {'_id': ObjectId('5cb743e78447b053746613b5'),
'country': 'America',
'first_name': 'pnklbxzojo',
'gender': 1,
'last_name': 'gnzdollddp',
'vehicule': 'Ford Flex'},
'value2': {'radio': 'Soundtrack', 'timeListened': 4331162000.0}}
pymongo output:
{'_id': {'_id': ObjectId('5cb743e78447b053746613b5'),
'country': 'America',
'first_name': 'pnklbxzojo',
'gender': 1,
'last_name': 'gnzdollddp',
'vehicule': 'Ford Flex'},
'value': {'radio': 'Soundtrack', 'timeListened': 4331162000.0}}
js script get this output expected:
{"_id":{"country":"America",
"_id":"5cb743e78447b053746613b5",
"gender":1,
"vehicule":"Ford Flex",
"last_name":"gnzdollddp",
"first_name":"pnklbxzojo"},
"value":{"fucks":[{"radio":"Soundtrack","timeListened":4331162000},
{"totalTimeListened":690238990000}]}}