【问题标题】:Why doesn't MongoDb store my slashes in this string?为什么 MongoDb 不将我的斜杠存储在这个字符串中?
【发布时间】:2012-07-10 02:54:41
【问题描述】:

谁能告诉我为什么这个命令不能从 MongoDB shell 客户端工作:

db.coll.update({'live':true},{$set:{'mask':"\D\D\D\D\D\D\D\D"}},false,true)

但是

db.coll.findOne({'id':'someId'})

将掩码字段返回为:

"mask" : "DDDDDDDD",

斜线去哪儿了?

我尝试使用 \\D 进行“双重转义”,并插入两个斜杠:

"mask" : "\\D\\D\\D\\D\\D\\D\\D\\D",

MongoDB shell 版本:2.0.6,MongoDB 版本:2.0.5,OSX Lion

谢谢

【问题讨论】:

  • 任何人都可以留下一个例子,请确保您自己的斜杠被正确转义,这样我就可以避免任何混淆。谢谢:)

标签: mongodb


【解决方案1】:

实际上,MongoDB 确实将反斜杠正确地存储在数据库中。您所看到的是 mongo shell 如何显示包含反斜杠字符的字符串的工件。它会将它们打印为转义序列而不是单个字符。如果您查看返回的实际数据,您会发现它是正确的。

> db.tst.drop()
true
> db.tst.insert({ _id: 1, str: "\\D\\D\\D\\D\\D"} );
> x = db.tst.findOne( {_id:1} );
{ "_id" : 1, "str" : "\\D\\D\\D\\D\\D" }     // looks like it's double-backslashes
> x.str;
\D\D\D\D\D     // but it's really not
x.str.quote();
"\\D\\D\\D\\D\\D"   // it's what String.quote() prints

【讨论】:

  • 谢谢,在检查了客户端应用程序中的存储值后,我解决了这个问题。
  • @RobDudley 我认为这是更好的答案。虽然它是稍后发布的,但它是正确的,并解释了问题和正在发生的事情。接受的只是“使用正则表达式文字符号”,这只是一个不错的提示
【解决方案2】:

使用正则表达式(不带引号)

/\D\D\D\D\D\D\D\D/ 

或者使用四个斜线。

"////D" ==> "/D"

【讨论】:

  • 我明白了。你说的对。我没有很好地阅读这个问题。现在这应该可以了! :)
  • 或不带引号(对不起)导致“掩码”:/\D\D\D\D\D\D\D\D/,
  • 没关系。这不是一个字符串。这是一个正则表达式。您可以使用toString() 方法获取它的字符串。你必须修剪斜线。这是一种解决方法...
  • 哪四个斜线?字符串中的四个斜杠按字面意思解释。
  • 看来shell中的输出具有误导性。斜杠被正确存储,转义为 \\(双斜杠),客户端驱动程序处理转义回单斜杠。
【解决方案3】:

这是 *nix 和 C 潜入一切的例子。在 C 中,字符 \ 是转义字符。如果允许您“转义”下一个或多个字符以形成一些特殊字符或字符序列。因此,\n 是换行符 (0x0a),\d 是回车符 (0x0d)。所以,既然 \ 有这个特殊的含义,为了得到一个 \ 你必须有两个。

将您的字符串更改为“\D\D\D\D\D\D\D\D”

【讨论】:

  • 原帖中并不清楚(由于转义问题!)但我已经尝试过双重转义斜线,然后 MongoDB 根据第 4 个代码块存储两个斜线
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
相关资源
最近更新 更多