【问题标题】:Mongo 3.0.2 driver: how to escape dots(.) in strings?Mongodb 3.0.2 驱动程序:如何在字符串中转义点(。)?
【发布时间】:2015-09-08 21:06:50
【问题描述】:

我想将字符串“http://1.1.1.1/olala”放入 mongodb,而不是

{data: "http://1.1.1.1/olala"}

我明白了

{data: {"http://1": {1: {1: "1/olala"}}}}

有没有一种标准的方法可以使用 java 将带有特殊字符的字符串插入到 mongodb 中?

我做 upsert 的方式是

collection.updateOne(new Document("name", key), 
                     new Document("$inc", new Document(methodName, 1)), 
                     opt.upsert(true), null);

methodName 是带逗号的网址。我试图引用值,但得到了

{data: {"'http://1": {1: {1: "1/olala'"}}}}

除此之外,我建议以后会有更多的“坏”角色。

UPD 更复杂的示例,但不明白它有什么帮助

final UpdateOptions opt = new UpdateOptions();
final String methodName = "http://1.1.1.1/ololo";
final MongoCollection<Document> collection =
    MongoAsyncClientFactory.getCollection();
//final String key = Statistics.getMainKey();
final String key = "any-key-you-want";
collection.updateOne(new Document("name", key),
                     new Document("$inc", new Document(methodName, 1)),
                     opt.upsert(true), null);

【问题讨论】:

  • 您显示的代码的哪一部分是 URL?如果您能提供一个简短但完整的示例,那将非常有帮助。

标签: java mongodb escaping special-characters insertion


【解决方案1】:

根据 MongoDB --> 您可以在字段名称中使用任何不特殊的(UTF8)字符(包含“.”或以“$”开头)

而字段"http://1.1.1.1/olala" 包含.,这是MongoDB 中的特殊字符并引用子文档,因此将其读取为,

 {"http://1": 
    {1: 
       {1: 
          "1/olala" : someValue
       }
    }
 }

请参阅问题跟踪器https://jira.mongodb.org/browse/SERVER-3229

此问题已作为按设计工作解决,因此我认为不会有任何更新。

更新

我刚刚注意到问题中的更新代码实际上似乎没有达到{data: "http://1.1.1.1/olala"}甚至{name: "http://1.1.1.1/olala"}

collection.updateOne(new Document("name", key), 
                     new Document("$inc", new Document(methodName, 1)), 
                     opt.upsert(true), null);

这实际上为key = "test" 创建了带有{"name" : "test" } 的文档,然后将文档更新为

{
  "http://1" : {"1" : { "1" : { "1/ololo" : 1 }
    }
  },
  "name" : "test"
}

因此,如果这不是您想要实现的目标,请考虑更改您的逻辑。

【讨论】:

  • 据我了解,解决方案是手动转义$.,还是完全避免它们?
  • 你必须避免它们转义.$是不可能的。你可以尝试用其他字符组合等替换它们。
  • 另外,我刚刚更新了答案。可能你也需要检查你的更新方法
  • 但如果我需要存储特殊字符怎么办?改用 \u 转义?关于更新方法 - 是的,如果它不存在,它会创建名称为 key 的对象。它正在记录,key 的名称每天都在变化。
  • 您不能以任何方式将. 和以$ 开头的密钥直接存储在mongoDB 中。您的应用程序的数据访问层可以创建一种机制,将每次出现的此类事件编码和解码为其他一些字符组
猜你喜欢
  • 2014-01-31
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多