私はあなたの問題をほぼ解決するこの解決策を見つけました。
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 }
matchedIds
はlist
配列に共通の値を持つドキュメント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未満である場合にのみ動作します。アプリケーションを構築する場合は、アプリケーション層でも計算を行う方がよいでしょう。
Node.js、Java、mongo shellのどのような環境を使いますか? – Karlen
@カレン:ああ、私はmongoシェルを使用したいと思います。 – Blurie