2

ここで似たような質問がたくさん見られますが、私の問題を解決したものはありません。

次のようなドキュメントがあります。

{'_id': ObjectId('5006916af9cf0e7126000000'),'data': [{'count': 0,'alis':'statsministeren','avis':'Ekstrabladet'}, {'count': 0,'alis ':'thorning','avis':'Ekstrabladet'}, {'count': 0,'alis':'socialdemokratiets formand','avis':'Ekstrabladet'}, {'count': 0,'alis' :'lars barfod','avis':'Ekstrabladet'}, {'count': 0,'alis':'det konservative forkeparti','avis':'Ekstrabladet'}, {'count': 0, 'alis':'s\xf8vndal','avis':'Ekstrabladet'}, {'count': 0,'alis': u"sf's formand",'avis':'Ekstrabladet'}, {'count': 0,'アリス':'m\xf6ger','avis':'Ekstrabladet'}, {'count': 0,'alis':'lars l\xf8kke','avis':'Ekstrabladet'}, {'count': 0,'alis ':'l\xf8kke rasmussen','avis':'Ekstrabladet'}, {'count': 0,'alis':'lederen af danmarks st\xf8rste parti','avis':'Ekstrabladet'}, {' count': 0,'alis':'Pia Kj\xe6rsgaard','avis':'Ekstrabladet'}, {'count': 0,'alis':'statsministeren','avis':'Information'}, { 'count': 1,'alis':'thorning','avis':'情報'}, {'count': 0,'alis':'socialdemokratiets formand','avis':'情報'}, {' count': 0,'alis':'lars barfod','avis':'Information'}, {'count': 0,'alis':'det konservative folkeparti','avis':'Information'}, {'count': 0,'alis':'s\xf8vndal', 'avis':'Information'}, {'count': 0,'alis': u"sf's formand",'avis':'Information'}, {'count': 0,'alis':'m\xf6ger ','avis':'情報'}, {'count': 0,'alis':'lars l\xf8kke','avis':'情報'}, {'count': 0,'alis':' l\xf8kke rasmussen','avis':'Information'}, {'count': 0,'alis':'lederen af danmarks st\xf8rste parti','avis':'Information'}, {'count': 0,'alis':'Pia Kj\xe6rsgaard','avis':'情報'}, {'count': 0,'alis':'statsministeren','avis':'Berlingske'}, {'count': 0,'alis':'thorning','avis':'Berlingske' }, {'count': 0,'alis':'socialdemokratiets formand','avis':'Berlingske'}, {'count': 0,'alis':'lars barfod','avis':'Berlingske' }, {'count': 0,'alis':'det konservative folkeparti','avis':'Berlingske'}, {'count': 1,'alis':'s\xf8vndal','avis' :'Berlingske'}, {'count': 0,'alis': u"sf's formand",'avis':'Berlingske'}, {'count': 0,'alis':'m\xf6ger',' avis':'Berlingske'}, {'count': 0,'alis':'lars l\xf8kke','avis':'Berlingske'}, {'count': 0,'alis':'l\xf8kke rasmussen','avis':'Berlingske'}, {'count' : 0,'alis':'lederen af danmarks st\xf8rste parti','avis':'Berlingske'}, {'count': 0,'alis':'Pia Kj\xe6rsgaard','avis':'Berlingske '}, {'count': 0,'alis':'statsministeren','avis':'JP'}, {'count': 0,'alis':'thorning','avis':'JP'} , {'count': 0,'alis':'socialdemokratiets formand','avis':'JP'}, {'count': 0,'alis':'lars barfod','avis':'JP'} , {'count': 0,'alis':'det konservative folkeparti','avis':'JP'}, {'count': 0,'alis':'s\xf8vndal','avis':'JP'}, {'count': 0,'alis': u"sf's formand",'avis ':'JP'}, {'count': 1,'alis':'m\xf6ger','avis':'JP'}, {'count': 0,'alis':'lars l\xf8kke' ,'avis':'JP'}, {'count': 0,'alis':'l\xf8kke rasmussen','avis':'JP'}, {'count': 0,'alis':'lederen af danmarks st\xf8rste parti','avis':'JP'}, {'count': 0,'alis':'Pia Kj\xe6rsgaard','avis':'JP'}, {'count': 0 ,'alis':'statsministeren','avis':'BT'}, {'count': 0,'alis':'thorning','avis':'BT'}, {'count': 0,'alis':'socialdemokratiets formand','avis':'BT'}, {'count': 0,'alis':'lars barfod','avis':'BT'}, {'count' : 0,'alis':'det konservative folkeparti','avis':'BT'}, {'count': 0,'alis':'s\xf8vndal','avis':'BT'}, {'count': 0,'alis': u"sf's formand",'avis':'BT'}, {'count': 0,'alis':'m\xf6ger','avis':'BT' }, {'count': 0,'alis':'lars l\xf8kke','avis':'BT'}, {'count': 0,'alis':'l\xf8kke rasmussen','avis' :'BT'}, {'count': 0,'alis':'lederen af danmarks st\xf8rste parti','avis':'BT'}, {'count': 0,'alis':'Pia Kj\xe6rsgaard','avis':'BT'}, {'count': 0,'alis':'statsministeren','avis':'Politiken'}, { 'count': 0,'alis':'thorning','avis':'Politiken'}, {'count': 0,'alis':'socialdemokratiets formand','avis':'Politiken'}, {' count': 0,'alis':'lars barfod','avis':'Politiken'}, {'count': 0,'alis':'det konservative folkeparti','avis':'Politiken'} , {'count': 0,'alis':'s\xf8vndal','avis':'Politiken'}, {'count': 0,'alis': u"sf's formand",'avis':'Politiken '}, {'count': 0,'alis':'m\xf6ger','avis':'Politiken'}, {'count': 0,'alis':'lars l\xf8kke','avis':'Politiken'}, {'count': 0,'alis':'l\xf8kke rasmussen','avis':'Politiken'}, {'count': 0,'alis':'lederen af danmarks st\xf8rste parti','avis':'Politiken'}, {'count': 0,' alis':'Pia Kj\xe6rsgaard','avis':'Politiken'}],'time':'2012-07-18 12:35:22.241245'}count': 0,'alis':'Pia Kj\xe6rsgaard','avis':'Politiken'}],'time':'2012-07-18 12:35:22.241245'}count': 0,'alis':'Pia Kj\xe6rsgaard','avis':'Politiken'}],'time':'2012-07-18 12:35:22.241245'}

すなわち:

{_objectId : xxx, time: yyy, data :[ 72 similar dicts in this array ]}

72 個の辞書の 1 つから値を取得したいと考えています。

私の最初の試みは、次のようなものでした。

db.observations.find({'data.avis':'Ekstrabladet', 'data.alis':'thorning'}, {'data.count':1})

count私が本当に欲しかったのは、両方を満たす配列のカウント値であった場合、avis:ekstrabladet72個の辞書を取得しますalis:thorning(1つの配列のみ)。しかし、代わりに mongo はドキュメント全体を返します。

$elemMatch が見つかりましたが、同じ出力が得られます。

db.observations.find({'data' : {$elemMatch: {'alis':'thorning','avis':'Ekstrabladet'}}},{'data.count':1})

Python で完全なドキュメントを反復処理できると思いますが (これはフラスコ アプリ用です)、あまりエレガントではないようです。

私の質問は次のとおりです。ドキュメント内にアクセスして、ネストされた配列のドキュメントから値を取得するにはどうすればよいですか?

おまけ: 私はあらゆる種類のデータベースに慣れていないので、mongodb のみを選択しました。これは、非常に素晴らしく柔軟性があり、重要なデータを扱っていないためです。しかし、スケーラビリティは必要なく、代わりに sqlite などを使用できます。私が仕事に間違ったツールを使用していることについて強い意見がある場合は、悪用してください。

4

1 に答える 1

2

選択したサブ文書だけを返すことはできません。あなたはそれらすべてを手に入れるでしょう。そのため、クライアント側でフィルタリングする必要があります。

$elemMatchが本質的ですが、そうしないと、同じ配列エントリに対して avis と alis を一致させることはできません (どちらか一方に一致するものが 1 つあれば、ある意味で AND と OR で十分です)。

于 2012-07-18T12:29:25.813 に答える