2016-04-08 6 views
2

は私のコレクションです:として「ユーザー」と「率」の値のすべての組み合わせであるすべての「映画」についてはムービーグループ化キーごとに2人のユーザーのすべての組み合わせを集めるにはどうすればよいですか?ここ

{ "user1" : 1, "rate1" : 1,"user2" : 2, "rate2" : 4, "movie" : 1} 
{ "user1" : 1, "rate1" : 3,"user2" : 2, "rate2" : 2, "movie" : 3} 
{ "user1" : 1, "rate1" : 3,"user2" : 3, "rate2" : 1, "movie" : 3} 
{ "user1" : 2, "rate1" : 2,"user2" : 3, "rate2" : 1, "movie" : 3} 

を:ここで

{ "user" : 1, "rate" : 1, "movie" : 1} 
{ "user" : 1, "rate" : 3, "movie" : 3} 
{ "user" : 1, "rate" : 2, "movie" : 4} 
{ "user" : 1, "rate" : 3, "movie" : 5} 
{ "user" : 2, "rate" : 4, "movie" : 1} 
{ "user" : 2, "rate" : 2, "movie" : 3} 
{ "user" : 2, "rate" : 5, "movie" : 6} 
{ "user" : 3, "rate" : 1, "movie" : 3} 

は私が取得したい結果です二つ以上の"user"の値について"movie"にグループ化するときは、「順列」を探しているという「映画」

答えて

0

に複数の「ユーザー」があるのペア。これは、あなたが実際に "データベース"クエリから得たものではありません。

$group"movie"$pushに他のデータがある場合は、その配列に2つ以下のエントリが含まれているコンテンツを除外し、そこから "可能な組み合わせ"を取り除くことができます。したがって、データベースにグループ化とフィルタリングを依頼することができますが、残りは「セット理論」のアルゴリズム用です。

これは結果における「部」集計ステートメントとコードの「部」の処理である。

db.movies.aggregate([ 
    { "$group": { 
    "_id": "$movie", 
    "people": { 
     "$push": { 
     "user": "$user", 
     "rate": "$rate" 
     } 
    } 
    }}, 
    { "$redact": { 
    "$cond": { 
     "if": { "$gt": [{ "$size": "$people" }, 1] }, 
     "then": "$$KEEP", 
     "else": "$$PRUNE" 
    } 
    }}, 
    { "$sort": { "_id": 1 } } 
]).forEach(function(doc) { 
    var n = doc.people.length; 
    var i,j; 

    for (i = 0; i < n; i++) { 
    for (j = i + 1; j < n; j++) { 
     printjson({ 
     "user1": doc.people[i].user, 
     "rate1": doc.people[i].rate, 
     "user2": doc.people[j].user, 
     "rate2": doc.people[j].rate, 
     "movie": doc._id 
     }) 
    } 
    } 
}) 

そこで凝集部自体は、最初に述べたように"movie"値に$groupを行い、を有する配列を作成$push。すべての結果が複数のエントリを持つ配列を持つわけではないので、$redactでそれらを削除します。これは、$sizeを使用して生成された配列を比較し、 "より大きい"($gt)エントリがあるかどうかを確認する "論理フィルタ"です。この段階で

結果も$sortを適用した後、次のようになります。

{ 
    "_id" : 1, 
    "people" : [ 
    { 
     "user" : 1, 
     "rate" : 1 
    }, 
    { 
     "user" : 2, 
     "rate" : 4 
    } 
    ] 
} 
{ 
    "_id" : 3, 
    "people" : [ 
    { 
     "user" : 1, 
     "rate" : 3 
    }, 
    { 
     "user" : 2, 
     "rate" : 2 
    }, 
    { 
     "user" : 3, 
     "rate" : 1 
    } 
    ] 
} 

次の部分は、実際には「アルゴリズム」可能性「ペア」の組み合わせを生成する次第です。それはかなり一般的でよく知られているアプローチですので、あなただけの各文書のアレイ上のループを実行して結果を生成する応答で返さ:私の質問に答えるための

{ "user1" : 1, "rate1" : 1, "user2" : 2, "rate2" : 4, "movie" : 1 } 
{ "user1" : 1, "rate1" : 3, "user2" : 2, "rate2" : 2, "movie" : 3 } 
{ "user1" : 1, "rate1" : 3, "user2" : 3, "rate2" : 1, "movie" : 3 } 
{ "user1" : 2, "rate1" : 2, "user2" : 3, "rate2" : 1, "movie" : 3 } 
+0

おかげで、あなたをし、それは完全に私の問題を解決しています。 – user6148078

関連する問題