MongoDB: запрос к хешу со специальными символами в ключах - PullRequest
7 голосов
/ 02 ноября 2011

Я начинаю работать с MongoDB (он выглядит AWESOME, 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"}), не будет работать, но есть ли альтернативы?

И, как побочный вопрос, есть ли лучший способ реализовать ту же функциональность, сохраняя всю информацию, вложенную в коллекцию?

Спасибо. :)

Ответы [ 2 ]

13 голосов
/ 02 ноября 2011

в соответствии с источником ниже, вы можете использовать любой символ UTF8 в имени поля - единственным исключением является '.'символ, который не допускается в именах полей (поскольку он используется для запроса поддокументов), а имена полей не могут начинаться с символа «$».

См .:

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

3 голосов
/ 02 ноября 2011

Если вы знаете имя ключа, вы можете просто запросить по

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 за указание в вышеприведенном комментарии , у вас не может быть символа точки '.' в имени поля, поскольку оно представляет точечную запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...