(些細な質問でしたらすみません。)
次のようなドキュメントがあります (Python 構文):
{
'_id': SomeObjectId,
'features': [
{'id': 'featureX' , 'value': 6},
{'id': 'featureY', 'value': 45}
]
}
この構造により、機能のリストに「featureX」を含むすべてのドキュメントを簡単に見つけることができます。しかし、サブドキュメントに関連付けられている値を取得することにも興味があります。Python では、次のようなクエリでドキュメントを取得した場合db.articles.find({'features.id': 'featureX'})
、正しい「値」を見つけるために配列「機能」を反復処理する必要があると思います。
興味深い値を得ることができる他の種類のクエリはありますか (この場合、ドキュメント全体を取得する必要はなく、{'id': 'featureX', 'value': 6} の部分のみを取得する必要があります)。配列内の予測可能なインデックス値にはなりません。
PS: ドキュメントを別の方法で設計すると思いますが、上記の要求が実行可能かどうかを知りたいです。
新しい構造は次のとおりです。
{
'_id': SomeObjectId,
'features': {
'featureX': { 'someproperty':'aaa', 'value':6 },
'featureY': {'someproperty' :'bbb', 'value':45}
}
}
このデザインについて何か問題はありますか? 私の場合、「featureX」、「featureY」は一意であるため、それらを辞書キーとして使用しても問題ありません。
編集:ドキュメント内の「featureX」と「featureY」をアトミックに更新する必要があり、MongoDB はトランザクションをサポートしていないことを明確にする必要があります。また、2 番目の設計では、サブドキュメントを取得することはできませんが、特定のキーを持つサブドキュメントをクエリできると仮定すると、クライアント コードで必要な情報をすばやく簡単に取得できます。
このクエリは仕事をするべきだと思います:
result = db.articles.find_one({ 'features.featureX': {'$exists': True} } )
interesting_value = result['features']['featureX']['value']