Моя коллекция тестов выглядит следующим образом:
{ "_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[] ) => {
...
});
Оба работают.