2017-01-16 7 views
2

は例えば、私はそのリストには、少なくとも1個の要素の一致を持つすべての項目をマージするクエリを行うだろう、コレクション内の6つの項目少なくとも1つの要素が一致する場合、2リストを集計する方法は?

{ _id: 1, list: ["A", "B"] } 
{ _id: 2, list: ["C", "A"] } 
{ _id: 3, list: ["E", "F"] } 
{ _id: 4, list: ["E", "D"] } 
{ _id: 5, list: ["U", "I"] } 
{ _id: 6, list: ["D", "K"] } 

を持っています。結果は次のようになります。

{ _id: 7, list: ["A", "B", "C"] } 
{ _id: 8, list: ["E", "F", "D", "K"] } 

私はMongoDBを初めて使用しているので、誰でもこのクエリを手伝ってくれますか?どうもありがとう。

+0

Node.js、Java、mongo shellのどのような環境を使いますか? – Karlen

+0

@カレン:ああ、私はmongoシェルを使用したいと思います。 – Blurie

答えて

1

私はあなたの問題をほぼ解決するこの解決策を見つけました。

db.lists.aggregate([ 
    {$unwind:"$list"}, 
    {$group:{_id:"$list", merged:{$addToSet:"$_id"}, size:{$sum:1}}}, 
    {$match:{size: {$gt: 1}}},  
    {$project:{_id: 1, merged:1, size: 1, merged1: "$merged"}},  
    {$unwind:"$merged"},  
    {$unwind:"$merged1"},  
    {$group:{_id:"$merged", letter:{$first:"$_id"}, size:{$sum: 1}, set: {$addToSet:"$merged1"}}},  
    {$sort:{size:1}},  
    {$group:{_id: "$letter", mergedIds:{$last:"$set"}, size:{$sum:1}}},  
    {$match: {size:{$gt:1}}} 
]) 

私は次の出力を与える私のmongoシェルでこれをテストしている:

{ "_id" : "E", "matchedIds" : [ 6, 3, 4 ], "size" : 2 } 
{ "_id" : "A", "matchedIds" : [ 1, 2 ], "size" : 2 } 

matchedIdslist配列に共通の値を持つドキュメントid -sを表します。

私は上記の集計でいくつかの最適化を行うことができると思いますが、最初に私はこれを見つけ、他の方法を見つけることを試みます。さらに、id -sとsetの値を一致させるために、集計piplineの最後に$lookup集約を使用することができます。私のmongoバージョンが$lookupをサポートしていないので、私はこれをテストできませんでした。しかし、Node.jsなどを使用すると、いくつかのforループ内でその値を手動で取得できます。

編集

リストごとに交差リストの量がこれ以上例えば

3.よりも、これは動作しませんされている場合は、このアルゴリズムでのみ動作します:

{ "_id" : 1, "list" : [ "A", "B" ] } 
{ "_id" : 2, "list" : [ "C", "A" ] } 
{ "_id" : 3, "list" : [ "E", "F" ] } 
{ "_id" : 4, "list" : [ "E", "D" ] } 
{ "_id" : 5, "list" : [ "U", "I" ] } 
{ "_id" : 6, "list" : [ "D", "K" ] } 
{ "_id" : 7, "list" : [ "A", "L" ] } 

が、これをされません:

{ "_id" : 1, "list" : [ "A", "B" ] } 
{ "_id" : 2, "list" : [ "C", "A" ] } 
{ "_id" : 3, "list" : [ "E", "F" ] } 
{ "_id" : 4, "list" : [ "E", "D" ] } 
{ "_id" : 5, "list" : [ "U", "I" ] } 
{ "_id" : 6, "list" : [ "D", "K" ] } 
{ "_id" : 7, "list" : [ "L", "K" ] } 

ここでは、7,6,4,3のIDを持つリストは交差を持つので、交差リストの数は4です。この場合、指定されたアルゴリズムは機能しません。これは、交差点の量は、各リスト

最終通告あなたがモンゴデータベース層での計算をマージ実行して、所望の結果を達成することができないようだ

ための4未満である場合にのみ動作します。アプリケーションを構築する場合は、アプリケーション層でも計算を行う方がよいでしょう。

+0

確かに、質問は挑戦的でしたが、この解決策は答えに記載されているように、たかだか3つの交差点の場合にのみ機能することに注意してください。 – Karlen

+0

ありがとうございました:Dあなたの徹底的な回答に感謝します。 – Blurie

+0

あなたは大歓迎です! – Karlen

関連する問題