任何人都可以告诉我为什么这个命令不能从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
由于
答案 0 :(得分: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
答案 1 :(得分:1)
这是* nix和C蔓延到一切的情况。在C中,字符\是转义字符。如果允许你逃避"下一个或多个字符形成一些特殊的字符或字符序列。因此,\ n是换行符(0x0a),\ n是回车符(0x0d)。所以,因为\具有这种特殊含义,为了得到一个\你必须有两个。
将您的字符串更改为" \ D \ D \ D \ D \ D \ D \ D \ D"
答案 2 :(得分:0)
使用正则表达式(不带引号)
/\D\D\D\D\D\D\D\D/
或使用四个斜杠。
"////D" ==> "/D"