【问题标题】:MongoDB: Query over a hash with special chars in keysMongoDB:在键中使用特殊字符查询哈希
【发布时间】:2011-11-02 02:31:43
【问题描述】:

我开始使用 MongoDB(它看起来很棒,顺便说一句),我对我的一个集合中的 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"}) 中的点表示法不起作用,但有替代方法吗?

作为一个附带问题,是否有更好的方法来完成相同的功能,同时将所有信息嵌套在集合中?

谢谢大家。 :)

【问题讨论】:

    标签: mongodb hash database


    【解决方案1】:

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

    参见:

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

    【讨论】:

      【解决方案2】:

      如果您知道键名,您可以通过查询

      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 中指出,您不能使用句点字符'.'在字段名称中,因为它表示点符号。

      【讨论】:

        猜你喜欢
        • 2015-04-29
        • 2013-06-05
        • 1970-01-01
        • 2011-09-04
        • 1970-01-01
        • 1970-01-01
        • 2015-07-02
        • 1970-01-01
        相关资源
        最近更新 更多