Как найти конкретный ключ в MongoDB?
Я должен найти все документы, которые включают "p396:branchCode" в качестве ключа в MongoDB. Значение не имеет значения, может быть что угодно. Я пытался использовать
{"p396:branchCode": new RegExp(".*")}
в MongoVUE, но я ничего не нашел. Моя БД очень вложенная, а в BranchCode есть суперключ "p396:checkTellersEApproveStatus"
3 ответа
Ваш ключ вложен в супер-ключ, поэтому вам нужно использовать оператор точки:
{"p396:checkTellersEApproveStatus.p396:branchCode": {$exists: true}}
Это предполагает p396:branchCode
всегда под p396:checkTellersEApproveStatus
, Если это не так, у вас есть проблема, потому что MongoDB не позволяет выполнять запросы для неизвестных ключей. Когда число возможных супер-ключей мало, вы можете запросить их все с помощью оператора $ или. Если нет, тогда ваш единственный вариант - это рефакторинг ваших объектов в массивы. Для примера приведем такую структуру:
properties: {
prop1: "value1",
prop2: "value2",
prop3: "value3"
}
было бы намного проще запрашивать значения в произвольных ключах, если они выглядят так:
properties: [
{ key: "prop1", value:"value1"} ,
{ key: "prop2", value:"value2"},
{ key: "prop3", value:"value3"}
]
потому что вы могли бы просто сделать db.collection.find({"properties.value":"value2"})
Похоже, вы хотите использовать $exists
оператор.
{'p396:branchCode': {$exists: true}}
Это предполагает, что этот запрос является частью пути:
{ 'p396:checkTellersApproveStatus': {'p396:branchCode': {$exists: true}}}
Который может быть сокращен до:
{ 'p396:checkTellersApproveStatus.p396:branchCode': {$exists: true}}
Если вы на самом деле "смешиваете типы", это, вероятно, не очень хорошая вещь. $exists
тогда это оператор для использования:
db.collection.find({
"p396:checkTellersApproveStatus.p396:branchCode": { "$exists": true }
})
Если значения являются действительными "все" числовыми и у вас есть ожидаемый "диапазон", используйте $gt
а также $lt
операторы вместо. Это позволяет использовать "индекс" для поля. И "разреженный" индекс, где его нет во всех документах, улучшит производительность:
db.collection.find({
"p396:checkTellersApproveStatus.p396:branchCode": {
"$gt": 0, "$lt": 99999
}
})
Во всех случаях это "потомок" родительского объекта "p396:checkTellersApproveStatus", поэтому вы используете "not notation" для доступа к полному пути к свойству.