MongoDB:使用密钥中的特殊字符查询散列

时间:2011-11-02 02:31:43

标签: mongodb hash database

我开始使用MongoDB(它看起来很棒,BTW),我对我的一个集合中的Hash数据类型有疑问。理论上我的东西看起来像这样:

{
    "account_id": "BNM-X10-0123456789",
    "account_profile": {
        "Client code": "0123456789",
        "Discount %": "15"
    }
}

正如您所看到的,account_profile哈希中的键有一些空格和特殊字符!我知道您可能会建议“只需更改client_codediscount_pct”,但我无法控制这些密钥,它们完全是用户定义的,并且本质上它们仍然包含白色空间和特殊字符。

所以,最初的问题是:如何对该信息执行查询?我 - 显然 - 知道db.foo.find({"account_profile.discount_pct": "15"})中的点符号不起作用,但有替代方法吗?

作为一个附带问题,有没有更好的方法来实现相同的功能,同时保持所有信息嵌套在集合中?

谢谢你们。 :)

2 个答案:

答案 0 :(得分:13)

根据以下来源,您可以在字段名称中使用任何UTF8字符 - 唯一的例外是'。'字段名称中不允许的字符(因为它用于查询子文档),字段名称不能以'$'字符开头..

查看:

https://jira.mongodb.org/browse/SERVER-3229

答案 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,你不能拥有句号“。”在字段名称中,因为它表示点符号。