2

私の考えを言葉で正確に説明することはできないので、ここに例を示します。

[
  {
    'description': 'fruits',
    'examples': [
      {
        'name': 'Apple',
        'color': ['red', 'green']
      },
      {
        'name': 'Banana',
        'color': 'yellow'
      }
    ]
  },
  {
    'description': 'vegetables',
    'examples': [
      {
        'name': 'Tomato',
        'color': 'red'
      },
      {
        'name': 'Carrot',
        'color': 'orange'
      }
    ]
  },
  {
    'description': 'Wweets',
    'examples': [
      {
        'name': 'Chocolate',
        'color': ['brown', 'black', 'white']
      },
      {
        'name': 'Candy',
        'color': 'various'
      }
    ]
  }
]

一歩一歩進みましょう:

すべての食品カテゴリを表示する場合は、次のコマンドでクエリを実行します

db.food.find()

野菜が見たい

db.food.find({ 'description': 'vegetables' })

さて、キャロットの見た目を忘れたとしましょう(笑)。私は何をしますか?私は以下を試しました(ネイティブnode.js MongoDBドライバー):

collection.find({'examples.name': 'Carrot'}, function(err, example){
  console.log(example)
  // It still returns me the whole object!
});

その結果、MongoDB がオブジェクトの次に高いインスタンスを返すことを期待していました。たとえば、私はこれをやりたかった。

console.log(example.color)
// 'orange'

何か考えはありますか?ドキュメント指向の DB は初めてです :/

4

1 に答える 1

2

一連のオブジェクトを 1 つのドキュメントに格納すると、(デフォルトで) ドキュメント全体が返されます。[*]

ドキュメントのフィールドの 1 つが配列である場合、一致させようとしている項目が配列内にある場合は、完全な配列が返されます。

通常、それらのサブセットのみを取得する場合は、すべてを 1 つのドキュメントに詰め込む誘惑に陥らないでください。

利用可能な代替手段があります:

すべての食品に「果物」、「野菜」、または「...」のフィールド「タイプ」がある食品のコレクションを保存できます。すべての食品、種類が「果物」の食品のみ、名前が「ニンジン」の食品のみなど、引き続きクエリを実行できます。

配列は、特定のオブジェクト/ドキュメントの属性のリストに最適ですが、最初のクラスのオブジェクトとして取得したいドキュメントをそれらに詰め込む場合にはあまり適していません。

[*] フィールドのサブセットのみを射影して取得する方法がありますが、それでもフィールド全体を取得できます。

于 2012-07-29T23:15:16.927 に答える