【问题标题】:Generate query results based on tags in PouchDB根据 PouchDB 中的标签生成查询结果
【发布时间】:2015-09-23 00:34:31
【问题描述】:

我是 NoSQL 的新手,但我决定将 PouchDB 用于我正在创建的 Angular 应用程序。

将会有一系列问题(总共约 1000 个),每个问题都有自己的标签。每个对象不应有超过 6 或 7 个标签。示例数据为:

{
    "text": "Question?",
    "answers": [
        { "text": "Yes", "correct": true },
        { "text": "No", "correct": false }
    ],
    "tags": ["tag1", "tag3"]
},
{
    "text": "Question?",
    "answers": [
        { "text": "Yes","correct": true },
        { "text": "No", "correct": false }
    ],
    "tags": ["tag2", "tag3"]
}

我完全不知道如何查询数据库以仅检索具有“tag2”的问题或具有“tag1”和“tag3”的问题。

我在How to query PouchDB with SQL-like operators 发现了这个问题,但我似乎无法理解它是如何工作的。我尝试根据我的数据修改它,查询数据库时总是得到0结果。

我想我最大的困难是将它与 SQL 进行比较,但实际上并非如此。有谁知道我如何根据特定标签创建查询?

【问题讨论】:

    标签: angularjs couchdb pouchdb


    【解决方案1】:

    是的,您可以像这样创建map/reduce query

    // document that tells PouchDB/CouchDB
    // to build up an index on tags
    var ddoc = {
      _id: '_design/my_index',
      views: {
        my_index: {
          map: function (doc) {
            doc.tags.forEach(function (tag) {
              emit(tag);
            });
          }.toString()
        }
      }
    };
    // save it
    pouch.put(ddoc).then(function () {
      // success!
    }).catch(console.log.bind(console));
    

    然后你查询它:

    pouch.query('my_index', {key: myTag, include_docs: true}).then(function (res) {
      // got a result
    }).catch(console.log.bind(console));
    

    如果你想找到多个标签,你可以只用keys而不是key

    顺便说一句,将来当我将$elemMatch$in 添加到pouchdb-find 时,这会更容易。

    【讨论】:

    • 感谢您抽出宝贵时间回答这个问题。我的查询成功,但仍然返回 0 行。我的查询看起来像 db.query('my_index', { key: '203', include_docs: true }).then 并确认至少有一条记录的标签为 203。我错过了什么?
    • 可能与未正确生成视图有关。当我使用 fauxton UI 创建视图时,索引是空的,但是当我执行简单的发出 doc._id 时,我会输出所有记录。 ::edit:: 啊就是这样,一旦我删除了 fauxton 中的 .toString ,我就能够返回结果。搜索多个键时如何压缩列表?现在我有重复。有没有办法说好的,只有两个标签都存在的记录?
    • 您的简化示例让我更好地理解了地图功能。在了解之后,我能够让上面引用的示例满足我的需要。我期待看到 pouchdb-find 更新为 $elemMatch 和 $in。有路线图吗?
    • 对于具有两个标签的记录,您需要执行两个单独的查询,然后加入结果(不幸的是)。至于 pouchdb-find,我没有路线图,但我会在有时间的时候研究它。 :)
    • 感谢@nlawson。我还有一个问题,有没有办法堆叠视图?假设我有一个类别和标签。我可以执行查询以选择单个类别,然后搭载另一个视图来查询该类别中的特定标签吗?
    猜你喜欢
    • 2017-04-29
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多