5

谁能告诉我为什么这个命令在 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

谢谢

4

3 回答 3

11

实际上,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
于 2012-07-03T22:12:35.370 回答
1

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

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

或使用四个斜线。

"////D" ==> "/D"
于 2012-07-03T20:43:28.083 回答
1

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

将您的字符串更改为 "\D\D\D\D\D\D\D\D"

于 2012-07-03T20:47:23.797 回答