0

次の構造のコレクションがあります。

{'cnpj_fundo': '08.807.621/0001-93',
 'pl_posicao': 'R$ 8.654.202,31',
 'posicao': [{'empresa_ligada': 'Não',
   'quantidade_vendas': '',
   'detalhes': "{'Tipo de Ativo:': ['Fundo de Investimento e de Cotas'], 'Fundo:': ['BTGP ACCESS SELECTION FUNDO DE INVESTIMENTO EM COTAS DE FUNDOS DE INVESTIMENTO MULTIMERCADO'], 'Tipo de Aplicação:': ['Cotas de Fundos'], 'CNPJ:': ['05.892.577/0001-79']}",
   'categoria': '',
   'valor_vendas': '',
   'perc_carteira': '99,76',
   'quantidade_compras': '',
   'posicao_final': '8.633.395,56',
   'classificacao': '',
   'valor_custos ': '',
   'link': 'CDADetAplic.aspx?PkCDAAplic=7234077',
   'valor_compras': '4.657.681'},
  {'empresa_ligada': 'Não',
   'quantidade_vendas': '',
   'detalhes': "{'Tipo de Ativo:': ['Fundo de Investimento e de Cotas'], 'Fundo:': ['BTG PACTUAL YIELD DI FUNDO DE INVESTIMENTO REFERENCIADO CRÉDITO PRIVADO'], 'Tipo de Aplicação:': ['Cotas de Fundos'], 'CNPJ:': ['00.840.011/0001-80']}",
   'categoria': '',
   'valor_vendas': '',
   'perc_carteira': '0,235',
   'quantidade_compras': '',
   'posicao_final': '20.315,84',
   'classificacao': '',
   'valor_custos ': '',
   'link': 'CDADetAplic.aspx?PkCDAAplic=7234076',
   'valor_compras': '2.059'},
  {'empresa_ligada': '',
   'quantidade_vendas': '',
   'detalhes': "{'Tipo de Ativo:': ['Outros'], 'Descrição:': ['VALORES A RECEBER'], 'Tipo de Aplicação:': ['Valores a receber']}",
   'categoria': ' VALORES A RECEBER',
   'valor_vendas': '',
   'perc_carteira': '0,006',
   'quantidade_compras': '',
   'posicao_final': '490,91',
   'classificacao': 'Paranegociação',
   'valor_custos ': '',
   'link': 'CDADetAplic.aspx?PkCDAAplic=7234078',
   'valor_compras': ''}],
 'nome_fundo': 'FUNDO DE INVESTIMENTO MULTIMERCADO CRÃ\x89DITO PRIVADO BOA ESPERANÃ\x87A - INVESTIMENTO NO EXTERIOR',
 'data_carteira': '10/2007',
 '_id': ObjectId('573d22f7a5c5da185c67fbd7')}

「Tipo de Ativo:」の「明確な」値を取得するにはどうすればよいですか?

db.distinct("posicao.detalhes.Tipo de Ativo:")

動作しません。

何かご意見は?

4

1 に答える 1

1

まず、記録に問題があります。の値は'detalhes'BSON ではなく、文字列 (JSON) ですが、これによりクエリが非常に難しくなります。

したがって、頭を悩ませて記録を更新する必要があります。Python では、次の方法でそれを行うことができます。

import json
updated_value = json.loads(value_of_detalhes)
db.update( ... {"$set": {"detalhes": updated_value}})

JSON 形式の文字列を変更したら、集計フレームワークを使用して個別の値を見つけることができます。次に例を示します。

> db.foo.find()
{ "_id" : ObjectId("573...94"), "p" : [ { "d" : { "tda" : [ "y" ] } } ] }
{ "_id" : ObjectId("573...95"), "p" : [ { "d" : { "tda" : [ "x" ] } } ] } 

私のダミーレコードがあなたのレコードと似た構造を持っていることに注意してください。それらは の値が であるという点で異なりdますBSON。あなたddetalhes. JSON を BSON に変更したら、次のことができます。

> db.foo.aggregate([{$group: {_id: "$p.d.tda"}}])
{ "_id" : [ [ "x" ] ] }
{ "_id" : [ [ "y" ] ] }

tda埋め込みフィールドには 2 つの異なる値があることがわかります。

私のスニペットは JS (mongo シェルを使用) にありますが、Python の原則は同じままです。

于 2016-05-19T05:17:53.123 に答える