为什么MongoDb不会在我的字符串中存储我的斜杠?

时间:2012-07-03 20:40:34

标签: mongodb

任何人都可以告诉我为什么这个命令不能从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

由于

3 个答案:

答案 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"