Invalid BSON field name xx 问题解决

本文解析了在使用MongoDB进行updateOne操作时遇到的java.lang.IllegalArgumentException异常,详细介绍了错误原因及修复方法,强调了在更新文档时正确使用$set操作符的重要性。

先贴一段报错 java.lang.IllegalArgumentException: Invalid BSON field name creaImpcntat org.bson.AbstractBsonWriter.writeName(AbstractBsonWriter.java:494)at org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:188)at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:131)at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:45)at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)at com.mongodb.connection.UpdateCommandMessage.writeTheWrites(UpdateCommandMessage.java:84)at com.mongodb.connection.UpdateCommandMessage.writeTheWrites(UpdateCommandMessage.java:42)at com.mongodb.connection.BaseWriteCommandMessage.encodeMessageBodyWithMetadata(BaseWriteCommandMessage.java:129)at com.mongodb.connection.RequestMessage.encodeWithMetadata(RequestMessage.java:160)at com.mongodb.connection.WriteCommandProtocol.sendMessage(WriteCommandProtocol.java:212)at com.mongodb.connection.WriteCommandProtocol.execute(WriteCommandProtocol.java:101)at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:64)at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:37)at com.mongodb.connection.DefaultServerDefaultServerProtocolExecutor.execute(DefaultServer.java:159)atcom.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286)atcom.mongodb.connection.DefaultServerConnection.updateCommand(DefaultServerConnection.java:140)atcom.mongodb.operation.MixedBulkWriteOperationDefaultServerProtocolExecutor.execute(DefaultServer.java:159)at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286)at com.mongodb.connection.DefaultServerConnection.updateCommand(DefaultServerConnection.java:140)at com.mongodb.operation.MixedBulkWriteOperationDefaultServerProtocolExecutor.execute(DefaultServer.java:159)atcom.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286)atcom.mongodb.connection.DefaultServerConnection.updateCommand(DefaultServerConnection.java:140)atcom.mongodb.operation.MixedBulkWriteOperationRun3.executeWriteCommandProtocol(MixedBulkWriteOperation.java:480)atcom.mongodb.operation.MixedBulkWriteOperation3.executeWriteCommandProtocol(MixedBulkWriteOperation.java:480)at com.mongodb.operation.MixedBulkWriteOperation3.executeWriteCommandProtocol(MixedBulkWriteOperation.java:480)atcom.mongodb.operation.MixedBulkWriteOperationRunRunExecutor.execute(MixedBulkWriteOperation.java:646)atcom.mongodb.operation.MixedBulkWriteOperationRunExecutor.execute(MixedBulkWriteOperation.java:646)at com.mongodb.operation.MixedBulkWriteOperationRunExecutor.execute(MixedBulkWriteOperation.java:646)atcom.mongodb.operation.MixedBulkWriteOperationRun.execute(MixedBulkWriteOperation.java:399)at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:179)at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:168)at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:230)at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:221)at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:168)at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:74)at com.mongodb.Mongo.execute(Mongo.java:781)at com.mongodb.Mongo2.execute(Mongo.java:764)atcom.mongodb.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:515)atcom.mongodb.MongoCollectionImpl.update(MongoCollectionImpl.java:508)atcom.mongodb.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:355)atcom.mongodb.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:350)atcom.yeahmobi.bigdata.analysis.dsp.dw.GateWayWinAndImpressStaticsAli2.execute(Mongo.java:764)at com.mongodb.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:515)at com.mongodb.MongoCollectionImpl.update(MongoCollectionImpl.java:508)at com.mongodb.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:355)at com.mongodb.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:350)at com.yeahmobi.bigdata.analysis.dsp.dw.GateWayWinAndImpressStatics_Ali2.execute(Mongo.java:764)atcom.mongodb.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:515)atcom.mongodb.MongoCollectionImpl.update(MongoCollectionImpl.java:508)atcom.mongodb.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:355)atcom.mongodb.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:350)atcom.yeahmobi.bigdata.analysis.dsp.dw.GateWayWinAndImpressStaticsAlianonfunanonfunanonfunwriteToMongo111anonfunanonfunanonfunapply1.apply(GateWayWinAndImpressStaticsAli.scala:301)atcom.yeahmobi.bigdata.analysis.dsp.dw.GateWayWinAndImpressStaticsAli1.apply(GateWayWinAndImpressStatics_Ali.scala:301)at com.yeahmobi.bigdata.analysis.dsp.dw.GateWayWinAndImpressStatics_Ali1.apply(GateWayWinAndImpressStaticsAli.scala:301)atcom.yeahmobi.bigdata.analysis.dsp.dw.GateWayWinAndImpressStaticsAlianonfunanonfunanonfunwriteToMongo111anonfunanonfunanonfunapply1.apply(GateWayWinAndImpressStaticsAli.scala:301)atcom.mongodb.spark.MongoConnector1.apply(GateWayWinAndImpressStatics_Ali.scala:301)at com.mongodb.spark.MongoConnector1.apply(GateWayWinAndImpressStaticsAli.scala:301)atcom.mongodb.spark.MongoConnectoranonfunanonfunanonfunwithCollectionDo1.apply(MongoConnector.scala:186)atcom.mongodb.spark.MongoConnector1.apply(MongoConnector.scala:186)at com.mongodb.spark.MongoConnector1.apply(MongoConnector.scala:186)atcom.mongodb.spark.MongoConnectoranonfunanonfunanonfunwithCollectionDo1.apply(MongoConnector.scala:184)atcom.mongodb.spark.MongoConnector1.apply(MongoConnector.scala:184)at com.mongodb.spark.MongoConnector1.apply(MongoConnector.scala:184)atcom.mongodb.spark.MongoConnectoranonfunanonfunanonfunwithDatabaseDo1.apply(MongoConnector.scala:171)atcom.mongodb.spark.MongoConnector1.apply(MongoConnector.scala:171)at com.mongodb.spark.MongoConnector1.apply(MongoConnector.scala:171)atcom.mongodb.spark.MongoConnectoranonfunanonfunanonfunwithDatabaseDo1.apply(MongoConnector.scala:171)atcom.mongodb.spark.MongoConnector.withMongoClientDo(MongoConnector.scala:154)atcom.mongodb.spark.MongoConnector.withDatabaseDo(MongoConnector.scala:171)atcom.mongodb.spark.MongoConnector.withCollectionDo(MongoConnector.scala:184)atcom.yeahmobi.bigdata.analysis.dsp.dw.GateWayWinAndImpressStaticsAli1.apply(MongoConnector.scala:171)at com.mongodb.spark.MongoConnector.withMongoClientDo(MongoConnector.scala:154)at com.mongodb.spark.MongoConnector.withDatabaseDo(MongoConnector.scala:171)at com.mongodb.spark.MongoConnector.withCollectionDo(MongoConnector.scala:184)at com.yeahmobi.bigdata.analysis.dsp.dw.GateWayWinAndImpressStatics_Ali1.apply(MongoConnector.scala:171)atcom.mongodb.spark.MongoConnector.withMongoClientDo(MongoConnector.scala:154)atcom.mongodb.spark.MongoConnector.withDatabaseDo(MongoConnector.scala:171)atcom.mongodb.spark.MongoConnector.withCollectionDo(MongoConnector.scala:184)atcom.yeahmobi.bigdata.analysis.dsp.dw.GateWayWinAndImpressStaticsAlianonfunanonfunanonfunwriteToMongo1.apply(GateWayWinAndImpressStaticsAli.scala:300)atcom.yeahmobi.bigdata.analysis.dsp.dw.GateWayWinAndImpressStaticsAli1.apply(GateWayWinAndImpressStatics_Ali.scala:300)at com.yeahmobi.bigdata.analysis.dsp.dw.GateWayWinAndImpressStatics_Ali1.apply(GateWayWinAndImpressStaticsAli.scala:300)atcom.yeahmobi.bigdata.analysis.dsp.dw.GateWayWinAndImpressStaticsAlianonfunanonfunanonfunwriteToMongo$1.apply(GateWayWinAndImpressStatics_Ali.scala:279)

造成这个原因是用mongoClinet updateone时候没有 加$set
代码如下:

val dateFormat=new SimpleDateFormat("yyyyMMdd")
val ttlTime: Date = dateFormat.parse(updateDate)
  finalDf.rdd.repartition(100).foreach(itm => {
  var bsons = new util.ArrayList[Bson]()

bsons.add(Filters.eq("app",itm(0)))
bsons.add(Filters.eq("day",itm(1)))
bsons.add(Filters.eq("hour",itm(2)))
bsons.add(Filters.eq("adx",itm(3)))
bsons.add(Filters.eq("os",itm(4)))
bsons.add(Filters.eq("osv",itm(5)))
bsons.add(Filters.eq("impType",itm(6)))
bsons.add(Filters.eq("country",itm(7)))
bsons.add(Filters.eq("updateDate",updateDate))

 val InsertOne = new Document("app", itm(0)).append("day", itm(1)).append("hour", itm(2)).append("adx", itm(3))
  .append("os", itm(4)).append("osv", itm(5)).append("impType",itm(6)).append("country", itm(7)).append("ttlTime",ttlTime)
 mongoConn.withCollectionDo(new WriteConfig(databaseName,
  ResultCol, Option(MongoConn)), { col: MongoCollection[Document] => col.updateOne(Filters.and(bsons),InsertOne) })

错误主要在:

 mongoConn.withCollectionDo(new WriteConfig(databaseName,
  ResultCol, Option(MongoConn)), { col: MongoCollection[Document] => col.updateOne(Filters.and(bsons),InsertOne) })

修改后 给InsertOne加上$set修改后的代码为

mongoConn.withCollectionDo(new WriteConfig(databaseName,
 ResultCol, Option(MongoConn)), { col: MongoCollection[Document] => col.updateOne(Filters.and(bsons),new Document("$set",updateOne),new UpdateOptions().upsert(true)) })

错误解决!

class MongoUtil(object): def __init__(self): db = pymongo.MongoClient().qa_system self.question = db.question self.answer = db.answer def query_question(self): question_iter_obj = self.question.aggregate([ {'$lookup': { 'from': 'answer', 'localField': '_id', 'foreignField': 'question_id', 'as': 'answer_list'}}]) question_list = [] for question in question_iter_obj: question_list.append( {'title': question['title'], 'detail': question['detail'], 'author': question['author'], 'vote_up': question['vote_up'] - question['vote_down'], 'answer_number': len(question['answer_list']), 'question_id': str(question['_id']) } ) return question_list def query_answer(self, question_id): answer_iter_obj = self.question.aggregate([ {'$match': {'_id': ObjectId(question_id)}}, {'$lookup': { 'from': 'answer', 'localField': '_id', 'foreignField': 'question_id', 'as': 'answer_list'}}]) question_answer = list(answer_iter_obj)[0] question_answer_dict = { 'question_id': str(question_answer['_id']), 'question_title': question_answer['title'], 'question_detail': question_answer['detail'], 'question_author': question_answer['author'], 'answer_num': len(question_answer['answer_list']) } answer_list = [] for answer in question_answer['answer_list']: answer_list.append( {'answer_detail': answer['answer'], 'answer_author': answer['author'], 'answer_id': str(answer['_id']), 'answer_vote': answer['vote_up'] - answer['vote_down']}) question_answer_dict['answer_list'] = answer_list return question_answer_dict
最新发布
11-28
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值