最大10万人の友人と以下の競合するスキーマが与えられているので、私のニーズに最も効率的なものを探すことに興味があります。私は上の任意の情報を見つけることができないようMongoDB組み込みサブアレイパフォーマンス対
{
"_id" : "…",
"user_id" : "1",
friends : [
{
"id" : "2",
"mutuals" : 3
},
{
"id" : "3",
"mutuals": "1"
},
{
"id" : "4",
"mutuals": "5"
}
]}
いるDoc1(USER_ID上のインデックス)
{
"_id" : "…",
"user_id" : "1",
friends : {
"2" : {
"id" : "2",
"mutuals" : 3
}
"3" : {
"id" : "3",
"mutuals": "1"
}
"4" : {
"id" : "4",
"mutuals": "5"
}
}
}
Doc2の(user_idを& friends.idに対する化合物のマルチキーインデックス)サブフィールド検索の効率。私はmongoが内部的にBSONとしてデータを実装していることを知っています。したがって、これは投影ルックアップがバイナリO(log n)であるかどうか疑問に思っていますか?
特に、friend_idのある友人が存在するかどうかを調べるuser_idがある場合、各スキーマの2つの異なるクエリはどのように比較されますか? (上記のインデックスを前提とします)返される内容は実際問題ではなく、友人が存在する場合はnullが返されないことに注意してください。
Doc1col.find({user_id : "…"}, {"friends.friend_id"})
Doc2col.find({user_id : "…", "friends.id" : "friend_id"}, {"_id":1})
また、$ set修飾子がどのように機能するかについても興味があります。スキーマ1の場合、クエリDoc1col.update({user_id : "…"}, {"$set" : {"friends.friend_id.mutuals" : 5})
が与えられた場合、friends.friend_idのルックアップはどのように機能しますか?これはO(log n)操作ですか(nは友人の数です)?
スキーマ2の場合、クエリDoc2col.update({user_id : "…", "friends.id" : "friend_id"}, {"$set": {"friends.$.mutuals" : 5})
は上記のものとどのように比較されますか?
ダイナミックキーは決して適切なアプローチではないため、配列スタイル(Doc2)を使用してください。また、スマート引用符を使用しないでください(正当な構文ではなく、読みにくい)。 – JohnnyHK
私はDoc2が余分なストレージのバイトのように使いますが、@ JohnnyHKはDoc1が本当に良いアプローチではないと言います。私はDoc1を使っている人からの質問の量を信頼し、Doc2に移動して何か彼らのスキーマと一緒に... – Sammaye
アドバイスをいただきありがとうございます。 @SammayeなぜDoc2は2バイト余分なストレージを使いますか?あなたはインデックスを参照していますか? Btwスマート引用符はコピーペーストからの間違いでした –