2012-09-16 65 views
0

假如我曾在一個數據庫中的下列文件:Casbah:如何更新字段名稱和空格時嵌入的對象?

{"_id":"test", "with space":{"a name":1}} 

我怎麼能寫在卡斯巴一$ SET查詢來更新「與空間」,「名稱」爲2。?

我想沿着線的東西:

collection.update(MongoDBObject("_id" -> "test"), "'with space'.'a name'" $set 2) 

但是,如果我的字段名稱是未知的,我必須在運行時撰寫他們?有沒有辦法以安全的方式「逃避」他們? (例如,如果它們中的任何一個包含單引號等等)

+0

我想你也許應該改變你的架構以使用標準化的鍵名,以及用戶輸入進去的數據的價值的一部分。同樣,這也使得查詢/聚合更容易。 –

回答

2

沒有需要轉義MongoDB的任何明確的;你可以通過一個變量的名稱,例如:

val key = MongoDBObject(name + '.' + embeddedname -> "somevalue") 

val key = MongoDBObject("with space.a name" -> "somevalue") 

雖然MongoDB的確實允許您從使用鍵名稱的任何有效UTF-8字符一邊「」和領先的'$',你通常會最好堅持字母數字鍵名加上下劃線。

如果您擔心用戶提供的輸入的安全,請參閱How does MongoDB address SQL or Query injection?

+0

+1,尼斯關於'.'和'$'的問題 –

+1

你和Wes說得很好。我猜這個空間的視覺方面對我有些詭計,我忘了它是「只是另一個角色」,它在識別週期分隔符時不應該引起歧義。兩者皆爲+1。謝謝。 – Eduardo

3

如何不將空格放入字段名稱中。認真。

好吧,如果你真的必須,應該做工精細沒有逃脫...

collection.update(MongoDBObject("_id" -> "test"), $set ("with space.a name" -> 2)) 
+0

單引號是密鑰的有效部分,因此它們可以正常工作(如果它們是密鑰的一部分)。 –

相關問題