2012-09-09 9 views
6

ユーザーごとのアイテムのリストを保守したいとします(Node.js環境でMongoDBのMongoDBで)。その後、アイテムがユーザーによって所有されているかどうかを照会します。たとえば、各ユーザーの好きな色をすべて保存し、特定のユーザーが特定の色を所有しているかどうかを確認したいとします。私のように、ユーザードキュメント内の配列ではなく、ユーザードキュメント内に埋め込まれたオブジェクトとして色を格納するほうがよいと思われます。私はを反復処理する必要がある配列対MongoDBアレイ対オブジェクト

if(user.colors.yellow){ 
    //true case 
} else { 
    //false case 
} 

:私はちょうどオブジェクトのプロパティが存在するかどうかを確認することができますよう、色がオブジェクトに存在するかどうかを確認するために、より効率的なようだということである理由色は、配列のどこかに存在するかどうかを確認するために、アレイ全体:事のこのタイプの配列を使用することはかなり流行しているよう

for (var i = 0; i < user.colors.length; i++) { 
    if(user.colors[i] === "yellow"){ 
    //true case 
    } else { 
    //false case 
    } 
} 

しかし、私はオンライン見てきた例の多くから、それはそうです。何か不足していますか?賛否両論は何ですか、そしてこれを行う最善の方法は何ですか?

+1

あなたはそのようなアドバイスへのリンクを提供することはできますか?はい、あなたは上記のようにcolorsの代わりに各色を別々に索引付けする必要がありますか? – c69

答えて

2

色が配列として格納されている場合は、forループを使用する必要はありません。あなただけのように、indexOfを使用することができます言っ

if(user.colors.indexOf("yellow") != -1){ 
    //true case 
} 

が、それは本当にあなたが埋め込まれた文書や配列を使用するかどうかのいずれかの方法を問題ではないはず。どちらか一方が大きなパフォーマンス上の優位性を与えるようなものではありません。

+0

「それはどちらかとは違うし、他の人がパフォーマンス上の大きな利点を与えるだろう」本当?!もしそうなら、どんな規模で。色が8色しかない場合は、一度無視してください。しかし、多くの色はどうですか、何度もループに入っていますか? –

1

インデックスをMongoDBコレクションに追加すると、配列プロパティにインデックスを追加するとクエリが効率的になり、自然な構文が使用されるため、このタイプの情報をMongoDBコレクションに格納することがよくあります。この場合、(色の配列プロパティが含まれているユーザーのコレクションを想定して)次のようなもの:あなたは、個々の色のプロパティでこれをしなかった場合

db.users.find({id: 1, colors: 'yellow'}) 

あなたは、このような、より厄介な探してクエリを持っているだろうし、あなたがしたいです

db.users.find({id: 1, 'colors.yellow': true}) 
関連する問題