2012-11-30 13 views
10

最大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})は上記のものとどのように比較されますか?

+3

ダイナミックキーは決して適切なアプローチではないため、配列スタイル(Doc2)を使用してください。また、スマート引用符を使用しないでください(正当な構文ではなく、読みにくい)。 – JohnnyHK

+1

私はDoc2が余分なストレージのバイトのように使いますが、@ JohnnyHKはDoc1が本当に良いアプローチではないと言います。私はDoc1を使っている人からの質問の量を信頼し、Doc2に移動して何か彼らのスキーマと一緒に... – Sammaye

+0

アドバイスをいただきありがとうございます。 @SammayeなぜDoc2は2バイト余分なストレージを使いますか?あなたはインデックスを参照していますか? Btwスマート引用符はコピーペーストからの間違いでした –

答えて

1

doc1は、データをUIに管理しやすいパッケージで提示することが主な要件である場合には、望ましいものです。その投影を使用して所望のデータのみをフィルタリングするのは簡単{}, {friends.2 : 1}

DOC2は、ご利用の場合は本当に返されるかは重要ではありませんし、インデックスをフェッチスピードアップという結果注意を気にしませんので、あなたの最強の試合です。そのDOC2の上に

は、最終的なノートで非常にクリーンな構文

db.doc1.findOne({ $and : [{ user_id: 1 }, { "friends.2" : {$exists: true} }] }) 

db.doc2.findOne({user_id: 1, friends.id : 2}) 

を可能にし、しかし、一つはDOC1にsparse indexを作成(および$が存在する使用)することができますが、友人一人一人が疎なインデックスを必要とする10万人の友人の可能性によって、それは不条理なことになります。男性、女性、年齢層[0-10,11-16,25-30、..]以上の人物[ジン、ウイスキー、ウォッカ、...]

関連する問題