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>
我在 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>