6

ユーザーごとのアイテムのリストを維持し(MongoDBでNode.js環境のMongoose ODMを使用)、後でクエリを実行してアイテムがユーザーによって所有されているかどうかを確認するとします。たとえば、各ユーザーのお気に入りの色をすべて保存し、後で特定の色が特定のユーザーによって所有されているかどうかを確認したいとします。ユーザードキュメント内の配列ではなく、ユーザードキュメント内に埋め込みオブジェクトとして色を格納する方がよいように思われます。その理由は、オブジェクトのプロパティが存在するかどうかを確認できるので、オブジェクトに色が存在するかどうかを確認する方が効率的であるように思われるためです。

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
  }
}

しかし、私がオンラインで見た多くの例から、このタイプのものに配列を使用することはかなり普及しているようです。私は何かが足りないのですか?長所/短所は何ですか、そしてこれを行うための最良の方法は何ですか?

4

2 に答える 2

2

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

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

とはいえ、埋め込みドキュメントを使用するか配列を使用するかは、どちらの方法でも問題ありません。どちらかがパフォーマンスに大きな利点をもたらすわけではありません。

于 2012-09-09T03:07:24.277 に答える
1

このタイプの情報をMongoDBコレクションに格納するために使用される埋め込み配列をよく目にします。これは、配列プロパティにインデックスを追加すると、クエリが効率的になり、自然な構文が使用されるためです。この場合、次のようになります(colors配列プロパティを含むusersコレクションを想定しています)。

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

個々の色のプロパティを使用してこれを行った場合、このような見栄えの悪いクエリが発生し、(colors上記のようにではなく)各色に個別にインデックスを付ける必要があります。

db.users.find({id: 1, 'colors.yellow': true})
于 2012-09-09T03:51:50.497 に答える