2012-07-03 52 views
4

誰能告訴我爲什麼這個命令不會從MongoDB的shell客戶端的工作:爲什麼MongoDb不在這個字符串中存儲我的斜槓?

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的外殼版本:2.0.6,MongoDB的版本:2.0.5,OSX獅子

由於

+0

任何人都可以離開一個例子,請確保你自己的斜槓正確地逃脫,所以我可以避免任何混淆。謝謝:) –

回答

1

使用正則表達式表示法(不帶引號)

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

或者使用4條斜線。

"////D" ==> "/D" 
+0

聽起來像他試圖... – Kasapo

+0

我明白了。你是對的。我沒有很好地閱讀這個問題。現在這應該工作! :) – Mohsen

+0

導致「/ DDDDDDDD /」 –

1

這是* nix和C爬到一切的情況。在C中,字符\是轉義字符。如果允許您「轉義」下一個字符或字符以形成一些特殊字符或字符序列。因此,\ n是換行符(0x0a),\ d是回車符(0x0d)。所以,因爲\有這個特殊的含義,爲了得到一個\你必須有兩個。

更改字符爲 「\ d \ d \ d \ d \ d \ d \ d \ d」

+0

原來的帖子中沒有清楚(由於轉義問題!),但我已經嘗試了雙斜線斜槓,並且MongoDB然後按照第四代碼塊存儲了兩個斜線 –

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 
+0

謝謝,在檢查客戶端中的存儲值應用程序我工作了。 –

+0

@RobDudley我認爲這是更好的答案。雖然它稍後發佈,但這是正確的,並解釋了問題以及發生了什麼。接受的只是'使用正則表達式文字符號',這只是一個很好的提示 –

相關問題