如何使用Map动态生成的键查询集合中的所有文档?

时间:2019-10-16 05:12:58

标签: mongodb mongoose mongoose-schema

我的测试收藏如下:

{ "_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个文档。

注意:attributesMapMap类型。在任何示例中,我都找不到与Map相关的用例。

更新

大多数人认为这可能是this问题的重复

但是当我尝试:

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-mehtaAshh解决了动态条件定义的问题。

1] sushant-mehta的进路

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

2] Assh的方法

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

两个都在工作。

0 个答案:

没有答案