PouchDB-find 从变量输入自动构建选择器

PouchDB-find automatically building selectors from variable input

我正在寻找一种方法来调整 db-find 选择器中的查询字段。我需要这个,因为过滤器访问不同的字段,这些字段可能始终处于活动状态,也可能不处于活动状态。

我已经尝试了两个选项,但 none 个有效:

  1. 在第一个选项中,我尝试将查询构建为字符串并对其进行评估:
 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.

中有介绍