Как запросить все документы в коллекции с помощью динамически сгенерированного ключа карты?

Моя коллекция тестов выглядит следующим образом:

{ "_id" : ObjectId("5da6a06ebd122e45c4533b64"), "attributesMap" : { "key1" : { "attr1" : "val1", "attr2" : "val2" } }, "name" : "Test Name", "test" : "Simple test data", "__v" : 0 }
{ "_id" : ObjectId("5da6a06ebd122e45c4533b65"), "attributesMap" : { "key1" : { "attr1" : "val1", "attr2" : "val2" } }, "name" : "Test Name", "test" : "Simple test data", "__v" : 0 }
{ "_id" : ObjectId("5da6a06ebd122e45c4533b66"), "attributesMap" : { "key1" : { "attr1" : "val1", "attr2" : "val2" } }, "name" : "Test Name", "test" : "Simple test data", "__v" : 0 }
{ "_id" : ObjectId("5da6a06ebd122e45c4533b67"), "attributesMap" : { "key1" : { "attr1" : "val1", "attr2" : "val2" } }, "name" : "Test Name", "test" : "Simple test data", "__v" : 0 }
{ "_id" : ObjectId("5da6a06ebd122e45c4533b68"), "attributesMap" : { "key1" : { "attr1" : "val1", "attr2" : "val2" } }, "name" : "Test Name", "test" : "Simple test data", "__v" : 0 }

Я могу легко запрашивать документы, используя параметры верхнего уровня, но для вложенных параметров, например. Я хочу запросить все документы, чей attributesMap имеет подраздел key1?

Для приведенного выше примера данных коллекции ответ для key1 будет 5 документов, а для key2 будет 0 документов.

Примечание. attributesMap относится к типу Map. Я не могу найти варианты использования, связанные с Map, ни в одном примере.

Обновить

Большинство людей предположили, что это может быть возможная копия этот вопрос

Но когда я попытался:

TestData.find( {  'attributesMap.key1' : { $exists: true } }, ( err: Error, res: ITestData[] ) => {
            if ( err ) console.log( 'err.message ' + err.message );
            if ( res ) console.log( 'res.length ' + res.length );
            if ( res ) {
                res.forEach( element => {
                    console.log( 'Element: ' + JSON.stringify( element ) );
                } );
            }
        } );

Я получаю результаты 5, но как мне динамически построить 'attributesMap.key1'? Одним из возможных решений могла бы быть строка, как показано ниже:

const key = 'key1';
const expr = "attributesMap." + key;
        TestData.find( {  expr : { $exists: true } }, ( err: Error, res: ITestData[] ) => {
....
});

Но значение const expr = "attributesMap." + key; не передается в раздел условий поиска, параметр expr здесь рассматривается как новая переменная, и результаты после этого изменения равны 0

Решение

В разделе комментариев Пользователь sushant-mehta & Ashh решил проблему динамического определения условий.

1] Подход сушант-мехта

const key = 'key1'; let expr = "attributesMap." + key; let expr2={};
expr2[expr]={'$exists': true};
TestData.find( expr2, ( err: Error, res: ITestData[] ) => {
...
});

2] Подход Аша

TestData.find( TestData.find({ ['attributesMap.' + keyName] : { $exists: true } }), ( err: Error, res: ITestData[] ) => {
    ...
    });

Оба работают.


person Prashant    schedule 16.10.2019    source источник
comment
в запросе используйте $exists как attributeMap.key1:{$exists:true} и attributeMap.key2:{$exists:true}   -  person sushant mehta    schedule 16.10.2019
comment
@sushantmehta, пожалуйста, взгляните на обновленный вопрос, спасибо за ответ.   -  person Prashant    schedule 16.10.2019
comment
попробуйте константный ключ = 'key1'; пусть выражение = атрибутыMap. + ключ; пусть expr2={} expr2[expr]={exists:true} и передаст expr2 в запросе   -  person sushant mehta    schedule 16.10.2019