我的测试收藏如下:
{ "_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相关的用例。
更新
大多数人认为这可能是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-mehta和Ashh解决了动态条件定义的问题。
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[] ) => {
...
});
两个都在工作。