3

次のようなことをしたい

SELECT e1.sender
FROM email as e1, email as e2
WHERE e1.sender = e2.receiver;

しかしMongoDBでは。MongoDB で MapReduce を介して実装できる JOIN に関する多くのフォーラムを見つけましたが、この例で自己結合を使用してそれを行う方法がわかりません。

私は次のようなことを考えていました:

var map1 = function(){
     var output = {
         sender:db.collectionSender.email, 
         receiver: db.collectionReceiver.findOne({email:db.collectionSender.email}).email
         }
     emit(this.email, output);                    
};
var reduce1 = function(key, values){
     var outs = {sender:null, receiver:null 
     values.forEach(function(v) {
       if(outs.sender == null){ 
          outs.sender = v.sender
          }
       if(outs.receivers == null){
          outs.receiver = v.receiver
          }        
 });
     return outs; }};
 db.email.mapReduce(map2,reduce2,{out:'rec_send_email'})

2 つの新しいコレクションを作成する - 受信者の電子メールのみを含む collectionReceiver と、送信者の電子メールのみを含む collectionSender

また

var map2 = function(){
     var output = {sender:this.sender, 
     receiver: db.email.findOne({receiver:this.sender})}
     emit(this.sender, output);                    
     };

var reduce2 = function(key, values){
      var outs = {sender:null, receiver:null
     values.forEach(function(v){
     if(outs.sender == null){
     outs.sender = v.sender
     }
     if(outs.receiver == null){
     outs.receiver = v.receiver
     }        
     });
     return outs; };};
db.email.mapReduce(map2,reduce2,{out:'rec_send_email'})

しかし、どれも機能しておらず、この MapReduce のことをよく理解していません。誰か説明してくれませんか?この記事http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/に触発されました。

さらに、Java で記述する必要があります。それを解決する方法はありますか?

4

1 に答える 1