• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

解决MONGO插入时候 INVALID BSON FIELD 问题

武飞扬头像
The_Well
帮助1

  1. java操作mongo提示Invalid BSON field name W3.DCS6.60RCAOG_D001_01
  1.  
    xception in thread "main" java.lang.IllegalArgumentException: Invalid BSON field name W3.DCS6.60RCAOG_D001_01
  2.  
    at org.bson.AbstractBsonWriter.writeName(AbstractBsonWriter.java:534)
  3.  
    at com.mongodb.internal.connection.BsonWriterDecorator.writeName(BsonWriterDecorator.java:193)
  4.  
    at com.mongodb.internal.connection.IdHoldingBsonWriter.writeName(IdHoldingBsonWriter.java:302)
  5.  
    at org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:211)
  6.  
    at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:154)
  7.  
    at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:45)
  8.  
    at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)
  9.  
    at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)
  10.  
    at com.mongodb.internal.connection.SplittablePayload$WriteRequestEncoder.encode(SplittablePayload.java:200)
  11.  
    at com.mongodb.internal.connection.SplittablePayload$WriteRequestEncoder.encode(SplittablePayload.java:187)
  12.  
    at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)
  13.  
    at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)
  14.  
    at com.mongodb.internal.connection.BsonWriterHelper.writeDocument(BsonWriterHelper.java:77)
  15.  
    at com.mongodb.internal.connection.BsonWriterHelper.writePayload(BsonWriterHelper.java:59)
  16.  
    at com.mongodb.internal.connection.CommandMessage.encodeMessageBodyWithMetadata(CommandMessage.java:145)
  17.  
    at com.mongodb.internal.connection.RequestMessage.encode(RequestMessage.java:138)
  18.  
    at com.mongodb.internal.connection.CommandMessage.encode(CommandMessage.java:59)
  19.  
    at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:247)
  20.  
    at com.mongodb.internal.connection.UsageTrackingInternalConnection.sendAndReceive(UsageTrackingInternalConnection.java:99)
  21.  
    at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.sendAndReceive(DefaultConnectionPool.java:500)
  22.  
    at com.mongodb.internal.connection.CommandProtocolImpl.execute(CommandProtocolImpl.java:71)
  23.  
    at com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:224)
  24.  
    at com.mongodb.internal.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:202)
  25.  
    at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:118)
  26.  
    at com.mongodb.internal.operation.MixedBulkWriteOperation.executeCommand(MixedBulkWriteOperation.java:419)
  27.  
    at com.mongodb.internal.operation.MixedBulkWriteOperation.executeBulkWriteBatch(MixedBulkWriteOperation.java:245)
学新通

当前java-mongo-driver版本为4.0.6

学新通

2、经过分析和查看源码结论为:

[JAVA-2810] Allow dots and $ in field names - MongoDB Jira。这也算是java驱动里面的一个bug. 因为用python写入带有小数点符号的到mongo可正常写入。

官方文档说明:

Field Names with Periods (.) and Dollar Signs ($) — MongoDB Manual

MongoDB Limits and Thresholds — MongoDB Manual

学新通

3.解决办法

重写一个类名为

CollectibleDocumentFieldNameValidator

注意包名:

com.mongodb.internal.validator
  1.  
    package com.mongodb.internal.validator;
  2.  
     
  3.  
    import org.bson.FieldNameValidator;
  4.  
     
  5.  
    import java.util.Arrays;
  6.  
    import java.util.List;
  7.  
     
  8.  
    /**
  9.  
    * 解决mongo驱动包中限制Field不能包含.以及$符号问题
  10.  
    */
  11.  
    public class CollectibleDocumentFieldNameValidator implements FieldNameValidator {
  12.  
    private static final List<String> EXCEPTIONS = Arrays.asList("$db", "$ref", "$id");
  13.  
     
  14.  
    @Override
  15.  
    public boolean validate(final String fieldName) {
  16.  
    if (fieldName == null) {
  17.  
    throw new IllegalArgumentException("Field name can not be null [hy]");
  18.  
    }
  19.  
     
  20.  
    if (fieldName.contains(".")) {
  21.  
    return true;
  22.  
    }
  23.  
     
  24.  
    if (fieldName.startsWith("$") && !EXCEPTIONS.contains(fieldName)) {
  25.  
    return true;
  26.  
    }
  27.  
    return true;
  28.  
    }
  29.  
     
  30.  
    @Override
  31.  
    public FieldNameValidator getValidatorForField(final String fieldName) {
  32.  
    return this;
  33.  
    }
  34.  
    }
学新通

因为java加载包是优先加载本地class文件中的类在加载lib包中,利用该特性覆盖

CollectibleDocumentFieldNameValidator

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfiehbg
系列文章
更多 icon
同类精品
更多 icon
继续加载