pymongo:文档必须是 dict 的一个实例

pymongo: Document must be an instance of dict

下午, 我遇到了 pymongo 的问题,我无法正确设置通过 insert_many() 插入 MongoDB 的参数。我遇到了以下错误:

TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping [while running 'Insere no MongoDB']

我做错了什么?

class InsertMongoDB(beam.DoFn):
    def process(self, element):
        arqJson=json.loads(element)

        client = MongoClient("mongodb://user:password@mkp-cr-marketplace-core.lcr88.gcp.mongodb.net/db-poc-base360?retryWrites=true&w=majority%20")
        db = client['db-poc-base360']
        db.tbPropostaSucesso.insert_many(arqJson)

        # tbPropostaErro = db['tbPropostaErro']
        # tbPropostaErro

        resultado = 0

        yield resultado

我从 Google PubSub 收到一条消息,并将其转发到名为 InsertMongoDB() 的方法。 我不知道如何适合我的按摩,其值是 json 格式,在 insert_many().

中正确使用它

当我调试变量“arqJson”时:

我使用的json是:

{
    "Status": "Sucesso ",
    "Documento": {
        "Apolice": [{
            "ItemAuto": [{
                "nmTipo": "FOX",
                "nrItem": "000001",
                "nmMarca": "VOLKSWAGEN",
                "aaModelo": "2017",
                "cdModelo": "0017664",
                "nmModelo": "TRENDLINE 1.0 FLEX 12V 5P",
                "aaFabricacao": "2016",
                "nmTipoVeiculo": "Hatch"
            }, {
                "nmTipo": "FOX",
                "nrItem": "000001",
                "nmMarca": "VOLKSWAGEN",
                "aaModelo": "2017",
                "cdModelo": "0017664",
                "nmModelo": "TRENDLINE 1.0 FLEX 12V 5P",
                "aaFabricacao": "2016",
                "nmTipoVeiculo": "Hatch"
            }],
            "ItemProp": [{
                "dsUF": "MG",
                "idLocal": "000001",
                "dsCidade": "BELO HORIZONTE",
                "dsEndereco": "RUA RUA RUA",
                "dsComplemento": "CASA"
            }],
            "cdEmpresa": "1",
            "idApolice": "501741",
            "idEndosso": "000000",
            "cdCarteira": "431",
            "cdSucursal": "010",
            "cdPatrimonio": "1",
            "nrItemContrato": "2",
            "dsTipoDocumento": "A",
            "cdVeiculoSegurado": "1"
        }],
        "Cliente": [{
            "cdCliente": "1",
            "nmCliente": "Lucas",
            "nrCpfCnpj": "4355582833",
            "icRegistroAtivo": "1",
            "cdAcaoInformacao": "A",
            "dtAcaoInformacao": "2020-02-02",
            "cdServicoAcaoInformacao": "cdServicoAcao",
            "cdUsuarioAcaoInformacao": "cdUsuarioAcao"
        }, {
            "cdCliente": "2",
            "nmCliente": "Lucas",
            "nrCpfCnpj": "43331971",
            "icRegistroAtivo": "1",
            "cdAcaoInformacao": "A",
            "dtAcaoInformacao": "2020-02-01",
            "cdServicoAcaoInformacao": "cdServicoAcao2",
            "cdUsuarioAcaoInformacao": "cdUsuarioAcao2"
        }],
        "Mensagem": [{
            "cdMensagem": "1",
            "dsMensagem": "Teste de mensagem"
        }],
        "EnderecoCobranca": [{
            "dsUF": "RS",
            "dsBairro": "INTEGRAÇÃO",
            "dsCidade": "PAROBE",
            "cdEndereco": 1,
            "dsEndereco": "RUA RUA RUA",
            "nrEndereco": "280",
            "dsComplemento": "",
            "icRegistroAtivo": "1",
            "cdAcaoInformacao": "A",
            "dtAcaoInformacao": "2020-02-02",
            "cdServicoAcaoInformacao": "cdServicoAcao",
            "cdUsuarioAcaoInformacao": "cdUsuarioAcao"
        }, {
            "dsUF": "SP",
            "dsBairro": "INTEGRAÇÃO2",
            "dsCidade": "POC2",
            "cdEndereco": 2,
            "dsEndereco": "RUA B",
            "nrEndereco": "222",
            "dsComplemento": "CASA 2",
            "icRegistroAtivo": "1",
            "cdAcaoInformacao": "A",
            "dtAcaoInformacao": "2020-02-01",
            "cdServicoAcaoInformacao": "cdServicoAcao2",
            "cdUsuarioAcaoInformacao": "cdUsuarioAcao2"
        }]
    }
}

2020/11/20:

目前我正在为需要在 insert_one(arqJson) 中使用的 arqJson 格式而苦苦挣扎。

我忘了提到我的方法 InsertMongoDB 从另一个名为 InsertPostgreSQL.[=17 的方法接收 arqJson =]

InsertPostgreSQL 做:

raise TypeError("%s must be an instance of dict, bson.son.SON, " TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping [while running 'Insere no MongoDB']

谢谢, 朱利安诺

解决方法是:

The first error is because your JSON contains a single document not multiple docs for an insert many. If you use brackets like this db.tbPropostaSucesso.insert_many([arqJson]) and convert it to a list with a single element it will work. Or you can try insert_one(arqJson). – DaveStSomeWhere 5 hours ago

谢谢 DaveStSomeWhere

我遇到了同样的问题,对我有用的是将 retryWrites=false 添加到连接 URL:

mongodb+srv://user:pass@server/etc...etc?retryWrites=false