Как найти конкретный ключ в 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" для доступа к полному пути к свойству.

Другие вопросы по тегам