Почему он не может объединить две коллекции с помощью pymongo mapreduce, в то время как по сценарию монго он проходит? - PullRequest
0 голосов
/ 30 апреля 2019

недавно у меня возникла простая проблема: я могу использовать скрипты монго, чтобы использовать 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}]}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...