PouchDB-find 从变量输入自动构建选择器
PouchDB-find automatically building selectors from variable input
我正在寻找一种方法来调整 db-find 选择器中的查询字段。我需要这个,因为过滤器访问不同的字段,这些字段可能始终处于活动状态,也可能不处于活动状态。
我已经尝试了两个选项,但 none 个有效:
- 在第一个选项中,我尝试将查询构建为字符串并对其进行评估:
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 (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'}
的注释
根据上面的评论,只需为显式 $and
创建一个集合
const filters = [{
name: 'Filter A',
field: 'lead guitar',
values: ['jerry']
},
{
name: 'Filter B',
field: 'rhythm guitar',
values: ['bobby']
}
];
const clauses = {};
filters.forEach(filter => clauses[filter.field] = {
$in: filter.values
});
const query = {
selector: {
$and: [clauses]
}
};
document.getElementById("content").innerText = JSON.stringify(query, undefined, 2);
<pre id="content"></pre>
但是请注意 $and
是隐含的,这在 CouchDB docs.
中有介绍
我正在寻找一种方法来调整 db-find 选择器中的查询字段。我需要这个,因为过滤器访问不同的字段,这些字段可能始终处于活动状态,也可能不处于活动状态。
我已经尝试了两个选项,但 none 个有效:
- 在第一个选项中,我尝试将查询构建为字符串并对其进行评估:
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 (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'}
根据上面的评论,只需为显式 $and
const filters = [{
name: 'Filter A',
field: 'lead guitar',
values: ['jerry']
},
{
name: 'Filter B',
field: 'rhythm guitar',
values: ['bobby']
}
];
const clauses = {};
filters.forEach(filter => clauses[filter.field] = {
$in: filter.values
});
const query = {
selector: {
$and: [clauses]
}
};
document.getElementById("content").innerText = JSON.stringify(query, undefined, 2);
<pre id="content"></pre>
但是请注意 $and
是隐含的,这在 CouchDB docs.