5

このコマンドが 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 Lion

ありがとう

4

3 に答える 3

11

実際、MongoDB はバックスラッシュをデータベースに適切に格納します。表示されているのは、mongo シェルがバックスラッシュ文字を含む文字列を表示する方法のアーティファクトです。単一の文字としてではなく、エスケープ シーケンスとして出力します。返された実際のデータを見ると、それが正しいことがわかります。

> 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

これは、*nixとCがすべてに忍び寄る場合です。Cでは、文字\はエスケープ文字です。次の1つまたは複数の文字を「エスケープ」して、特殊文字または文字シーケンスを形成できる場合。したがって、\ nは改行(0x0a)であり、\ dはキャリッジリターン(0x0d)です。したがって、\にはこの特別な意味があるため、\を取得するには、そのうちの2つが必要です。

文字列を「\D\ D \ D \ D \ D \ D \ D\D」に変更します

于 2012-07-03T20:47:23.797 に答える
1

正規表現表記を使用する(引用符なし)

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

または、4つのスラッシュを使用します。

"////D" ==> "/D"
于 2012-07-03T20:43:28.083 に答える