PouchDB-查找多层文档

PouchDB-find with multi-layer document

我在 CouchDB Github Repo 上问了以下问题,有人建议我在 Whosebug 上问。

假设我们有一个结构如下的 couchdb 文档:

{
  "_id": "4234",
  "properties": {
      "active": "true",
  }
}

我已经设法使用 createIndex 和 find 访问 _id 字段,基于 documentation.

这非常简单

但是我将如何去查询例如 属性 active? 很遗憾,我没有在网上找到关于此的信息。

感谢帮助,非常感谢。

一种蛮力方法是为 properties

创建索引
index: {
   fields: ['properties']
}

并查询 properties.active

{
   selector: {
      properties: {
         $eq: {
            active: "true"
         }
      }
   }
}

然而,这不是很好! properties 可能会在索引中添加一堆不需要的信息,进而可能会创建一个臃肿、浪费的索引。

更好的解决方案是针对 properties 的特定属性,例如properties.active:

{
  index: {
    fields: ['properties.active']
  }
}

例如,此查询查找所有 properties.active = "true"

{
   selector: {
      "properties.active": {
         $eq: "true"
      }
}

重要的是要了解,在查询嵌套字段时,必须将指定为字符串的索引字段包装起来,例如"properties.active":。这一点让一些人跌倒了。

下面的代码片段演示了该方法。

// canned test documents
const getDocsToInstall = () => {
  return [{
      "_id": "4234",
      "properties": {
        "active": "true",
      }
    },
    {
      "_id": "4235",
      "properties": {
        "active": "true",
      }
    },
    {
      "_id": "4236",
      "properties": {
        "active": "false",
      }
    }
  ]
}

let db;
const gel = (id) => document.getElementById(id);

const initDb = async() => {
  db = new PouchDB('test', {
    adapter: 'memory'
  });
  await db.bulkDocs(getDocsToInstall());
  return db.createIndex({
    index: {
      fields: ['properties.active']
    }
  });
}

const setJsonToText = (id, json) => {
  gel(id).innerText = JSON.stringify(json, undefined, 3);
}

(async() => {
  await initDb();
  const query = {
    selector: {
      "properties.active": {
        $eq: "true"
      }
    }
  };
  const results = await db.find(query);
  setJsonToText("query", query);
  setJsonToText("results", results);
})();
<script src="https://cdn.jsdelivr.net/npm/pouchdb@7.1.1/dist/pouchdb.min.js"></script>
<script src="https://github.com/pouchdb/pouchdb/releases/download/7.1.1/pouchdb.find.min.js"></script>
<script src="https://github.com/pouchdb/pouchdb/releases/download/7.1.1/pouchdb.memory.min.js"></script>
<h3>
  <pre>Query</pre>
</h3>
<pre id="query"></pre>
<hr/>
<h3>
  <pre>Results</pre>
</h3>
<pre id="results"></pre>