に複数の「ユーザー」があるのペア。これは、あなたが実際に "データベース"クエリから得たものではありません。
$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 }
おかげで、あなたをし、それは完全に私の問題を解決しています。 – user6148078