4

(些細な質問でしたらすみません。)

次のようなドキュメントがあります (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']
4

1 に答える 1

2

mongo コレクションhereおよびhereからサブドキュメントのみを取得することについて、この数回回答しました。

現在、これを行う方法はありません。これは、複数レベルの埋め込みドキュメントのフィルタリングの動作です。通常、一致するフィルターは、サブセットではなくドキュメント全体を返します。

mongo には、指定子を返すフィールドのこの位置 ($) 演算子と、 $ 演算子を使用してクエリを満たすために内容が使用されたサブドキュメントのデータを利用する機能に関連する 2 つの未解決の問題が既にあります。(この機能が本当に必要な場合は、ログインして投票してください)

また、代替スキーマもここでは役に立ちません。

したがって、各機能をこのように個別のドキュメントに保存して、希望どおりに機能させる必要があります

特徴1

{
'_id': SomeObjectId,
'name' :'some name',
'value': 'feature 1',
'some_field' : 'zzz'
}

特徴2

{
'_id': SomeObjectId,
'name' :'some name',
'value': 'feature 2',
'some_field' : 'zzz'
}

とクエリ

db.features.find({'_id':someobjectid})

特定の機能のみを返します

于 2011-10-11T09:49:06.437 に答える