2017-05-18 32 views
0

私は両方は、このような構造を持って、2つのコレクションを持っている:追加コレクションは、一緒に

id trips_in 
1  5 
2  10 

id trips_out 
1  6 
2  8 

私の質問は、私は、このようなように、単一のコレクションにそれらを組み合わせることができる方法である:私が見つけた

id trips_in trips_out 
1  5   6 
2  10   8 

mapReduceですが、その機能は私の必要以上のものに見えます。私は次のクエリを書いた:

tripsInMap = function() { 
    var values = { 
     trips_in: this.trips_in 
    }; 
    emit(this._id, values); 
}; 
tripsOutMap = function() { 
    var values = { 
     trips_out: this.trips_out 
    }; 
    emit(this._id, values); 
}; 
reduce = function(key, values) { 
    var result = { 
     "trips_out" : "", 
     "trips_in" : "" 
    }; 

    values.forEach(function(value) { 
     if(value.trips_out !== null) {result.trips_out = value.trips_out;} 

     if(value.trips_in !== null) {result.trips_in = value.trips_in;} 
    }); 

    return result; 
} 
db.tripsIn.mapReduce(tripsInMap, reduce, {"out": {"reduce": "joined"}}); 
db.tripsOut.mapReduce(tripsOutMap, reduce, {"out": {"reduce": "joined"}}); 

しかし、私は"trips_in": undefinedで終わる。より良い方法があるのだろうかと思います。

+0

クエリを追加できますか?これを達成するようにクエリを更新することができます。また、ここに** https://www.npmjs.com/package/zip-array ** – tom

+0

@anoopを実行するリンクがあります。私は私のクエリを追加しました。そのパッケージがどのように関連しているのか分かりません。 – ffritz

答えて

1

これが最速の方法ではないかもしれないが、あなたはこのような何かを試みることができる:最初の行はtripsInコレクション内の各ドキュメントを反復処理してtripsJoinedコレクションに対応する文書を挿入します

// Create the new collection with data from the tripsIn collection 
db.tripsIn.find().forEach(function(trip) { 
    db.tripsJoined.insert({ _id: trip._id, trips_in: trip.trips_in, trips_out: 0 }); 
}) 

// Update the trips_out field in the tripsJoined collection 
// using upsert:true to insert records that are not found 
db.tripsOut.find().forEach(function(trip) { 
    db.tripsJoined.update(
     { _id: trip._id}, 
     {$inc: {trips_in: 0, trips_out: trip.trips_out}}, 
     {upsert: true}); 
}) 

trips_outフィールドセット。

2行目はtripsOutコレクションを繰り返し、各ドキュメントでは対応するtripsJoinedドキュメントをtrips_out値で更新します。

{$inc: {trips_in: 0 ...とupsert:trueを追加しました。これは、tripsOutコレクションに、対応する_id値がないコレクションがtripsInコレクションに存在する場合、そのドキュメントが挿入され、trips_inフィールドが0に初期化されるように行われました。

+0

非常に良いソリューション、ありがとう! – ffritz

関連する問題