我开始使用MongoDB(它看起来很棒,BTW),我对我的一个集合中的Hash数据类型有疑问。理论上我的东西看起来像这样:
{
"account_id": "BNM-X10-0123456789",
"account_profile": {
"Client code": "0123456789",
"Discount %": "15"
}
}
正如您所看到的,account_profile
哈希中的键有一些空格和特殊字符!我知道您可能会建议“只需更改client_code
和discount_pct
”,但我无法控制这些密钥,它们完全是用户定义的,并且本质上它们仍然包含白色空间和特殊字符。
所以,最初的问题是:如何对该信息执行查询?我 - 显然 - 知道db.foo.find({"account_profile.discount_pct": "15"})
中的点符号不起作用,但有替代方法吗?
作为一个附带问题,有没有更好的方法来实现相同的功能,同时保持所有信息嵌套在集合中?
谢谢你们。 :)
答案 0 :(得分:13)
根据以下来源,您可以在字段名称中使用任何UTF8字符 - 唯一的例外是'。'字段名称中不允许的字符(因为它用于查询子文档),字段名称不能以'$'字符开头..
查看:强>
答案 1 :(得分:3)
如果您知道可以通过
查询的密钥名称db.foo.find({'account_profile.discount_pct' : '15'})
查看测试数据
> db.foofoo.insert({name:'ram',account_profile : {"Client code": "0123456789",'discount_pct' : 2}})
> db.foofoo.insert({name:'ram',account_profile : {"Client code": "0123456789",'discount_pct' : 2}})
> db.foofoo.insert({name:'ram',account_profile : {"Client code": "01236789",'discount_pct' : 5}})
> db.foofoo.insert({name:'ram',account_profile : {"Client code": "01236789",'discount_pct' : 2}})
> db.foofoo.insert({name:'ram',account_profile : {"Client code": "01236789",'discount %' : 2}})
> db.foofoo.insert({name:'ram',account_profile : {"Client code": "01236789",'discount_pct' : 4}})
> db.foofoo.insert({name:'ram',account_profile : {"Client code": "01236789",'discount_%' : 4}})
> db.foofoo.insert({name:'ram',account_profile : {"Client code": "01236789",'discount_%' : 2}})
> db.foofoo.find({'account_profile.discount_%': 2})
{ "_id" : ObjectId("4eb0c9965325a7760cfda3db"), "name" : "ram", "account_profile" : { "Client code" : "01236789", "discount_%" : 2 } }
> db.foofoo.find({'account_profile.discount_pct': 2})
{ "_id" : ObjectId("4eb0c9725325a7760cfda3d5"), "name" : "ram", "account_profile" : { "Client code" : "0123456789", "discount_pct" : 2 } }
{ "_id" : ObjectId("4eb0c97c5325a7760cfda3d7"), "name" : "ram", "account_profile" : { "Client code" : "01236789", "discount_pct" : 2 } }
感谢@Tilo指出上面的comment,你不能拥有句号“。”在字段名称中,因为它表示点符号。