我正在寻找一种方法来调整 db-find 选择器中的查询字段。我需要这个,因为过滤器访问不同的字段,这些字段可能始终处于活动状态,也可能不处于活动状态。
我尝试了两种选择,但都没有奏效:
- 在第一个选项中,我尝试将查询构建为字符串并对其进行评估:
public getFilteredItems(filters: ItemFilter[]) {
let selectors: string[] = [];
filters.forEach((filter: ItemFilter) => {
selectors.push(
"\n{\n'" +
filter.field +
"': { $in: \n ['" +
filter.values.join("','") +
"']} \n} \n "
);
});
return this.getDB('items').find({
selector: {
$and: eval('selectors.join()'),
// $and: selectors.join(),
// $and: selectors,
},
});
}
2:在第二次尝试中,我尝试将变量作为查询字段,但语法不允许。
public getFilteredItems(filters: ItemFilter[]) {
return this.getDB('items').find({
selector: {
filters[0].field: { $in: filter.values }
},
});
}
还有其他方法吗?
编辑: 过滤器如下所示:
filters: [
{
name: 'Filtergroup Template',
field: 'template',
values: ['case'],
always_active: true,
},
...
]
错误信息:
对于选项 1$and: eval('selectors.join()'),
和$and: selectors.join(),
,我收到以下错误:
index.es.js?26cc:74 Uncaught (in promise) TypeError: selectors.forEach is not a function
at mergeAndedSelectors (index.es.js?26cc:74)
at massageSelector (index.es.js?26cc:242)
at find$1 (index-browser.es.js?5d16:1194)
at eval (index-browser.es.js?5d16:119)
at eval (index-browser.es.js?5d16:112)
at PouchDB.eval (index-browser.es.js?5d16:1380)
at eval (index-browser.es.js?a2df:138)
at new Promise (<anonymous>)
at PouchDB.eval (index-browser.es.js?a2df:125)
at PouchDB.eval [as find] (index.js?dd8f:14)
如果我使用$and: selectors,
,我只会得到一个注释{docs: Array(0), warning: 'no matching index found, create an index to optimize query time'}