出会い系アプリに例えることができるアプリを構築しています。
次のような構造のドキュメントがいくつかあります。
$ db.profiles.find().pretty()
[
{
"_id": 1,
"firstName": "John",
"lastName": "Smith",
"fieldValues": [
"favouriteColour|red",
"food|pizza",
"food|chinese"
]
},
{
"_id": 2,
"firstName": "Sarah",
"lastName": "Jane",
"fieldValues": [
"favouriteColour|blue",
"food|pizza",
"food|mexican",
"pets|yes"
]
},
{
"_id": 3,
"firstName": "Rachel",
"lastName": "Jones",
"fieldValues": [
"food|pizza"
]
}
]
私がしようとしているのは、1 つ以上の で互いに一致するプロファイルを特定することですfieldValues
。
したがって、上記の例では、私の理想的な結果は次のようになります。
<some query>
result:
[
{
"_id": "507f1f77bcf86cd799439011",
"dateCreated": "2013-12-01",
"profiles": [
{
"_id": 1,
"firstName": "John",
"lastName": "Smith",
"fieldValues": [
"favouriteColour|red",
"food|pizza",
"food|chinese"
]
},
{
"_id": 2,
"firstName": "Sarah",
"lastName": "Jane",
"fieldValues": [
"favouriteColour|blue",
"food|pizza",
"food|mexican",
"pets|yes"
]
},
]
},
{
"_id": "356g1dgk5cf86cd737858595",
"dateCreated": "2013-12-02",
"profiles": [
{
"_id": 1,
"firstName": "John",
"lastName": "Smith",
"fieldValues": [
"favouriteColour|red",
"food|pizza",
"food|chinese"
]
},
{
"_id": 3,
"firstName": "Rachel",
"lastName": "Jones",
"fieldValues": [
"food|pizza"
]
}
]
}
]
これを map reduce として、または集約フレームワークで行うことを考えました。
いずれにせよ、「結果」はコレクションに永続化されます (上記の「結果」に従って)
私の質問は、どちらがより適しているでしょうか? そして、どこからこれを実装し始めますか?
編集
一言で言えば、モデルは簡単に変更できません。
これは、従来の意味での「プロファイル」とは異なります。
私が基本的に(疑似コードで)やろうとしていることは、次の行に沿っています。
foreach profile in db.profiles.find()
foreach otherProfile in db.profiles.find("_id": {$ne: profile._id})
if profile.fieldValues matches any otherProfie.fieldValues
//it's a match!
明らかに、その種の操作は非常に遅いです。
また、このデータは表示されないことにも言及する価値があるかもしれません。これは文字通り、「照合」に使用される単なる文字列値です。