2012-09-16 39 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

单引号是密钥的有效部分,因此它们可以正常工作(如果它们是密钥的一部分)。 –

相关问题