首页 > 解决方案 > MongoDB Java 驱动程序返回带引号的字符串

问题描述

我正在使用 MongoDB 在 Java 上开发一个应用程序来实现持久性。

我们有以下 POJO:

 private class DocumentType{
   private ObjectId oid;
   private String shortName;
   private String printingName;
   private String description;
   //Tax Code is a list of 3-digit numeric codes (must match pattern \\d{3}).
   private List<String> taxCodes;
 }

我们为这个类创建了一个自定义 CODEC,它简单地执行以下编码:

   writer.writeObjectId("_id", value.getOid());
   //... writes every property value, if value is null invokes writer.writeNull("property")
   wrirter.writeName("taxCodes");
   writer.writeStartArray();
   taxCodes.forEach(writer::writeString);
   writer.writeEndArray();

并且在解码时,在检查 reader BsonType 和 name 后,调用reader.readString.

一切正常,插入大量测试值后,可以验证 MongoShell 中的结果,并且符合预期,taxCodes 显示正确(即:“taxCodes”:[“001”,“003”,“145”, “325”])。

然后,在查询集合时,解码实现执行以下操作:

    //some funny stuff to make sure the reader state is not end of document.
    //some funny stuff to know which field name we are reading.
    //if readName result is taxCodes, we must read the array of tax codes:
    reader.readStartArray();
    while(reader.readBsonType() == BsonType.STRING)
        item.getTaxCodes().add(reader.readString());
    reader.readEndArray();
   //funny stuff to read other fields...

预期的结果是现在 taxCodes 将包含字符串值,这样调用taxCodes.forEach(System.out::printLn);应该会产生输出:

   001
   003
   145
   325

但它没有,它导致输出:

   "001"
   "003"
   "145"
   "325"

这不是我的 IDE 或系统控制台的问题,我准备了一个 UnitTest,如果我手动设置它们并且工作正常,它会打印 taxCodes。所以,我的问题是 reader.readString 不返回 001,而是返回“001”,但为什么呢?它只发生在该字段中,为什么不发生在名称字段或描述字段中?你会怎么做才能解决这个问题?我的测试mongodb服务器版本是4.4.0,我的驱动依赖是:

        <!-- https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-reactivestreams -->
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver-reactivestreams</artifactId>
            <version>4.0.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mongodb/bson -->
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>bson</artifactId>
            <version>4.0.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-core -->
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver-core</artifactId>
            <version>4.0.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.reactivestreams/reactive-streams -->
        <dependency>
            <groupId>org.reactivestreams</groupId>
            <artifactId>reactive-streams</artifactId>
            <version>1.0.3</version>
        </dependency>

谢谢。

标签: javamongodbmongodb-java

解决方案


推荐阅读