【问题标题】:Get random docs from PouchDB (or CouchDB)从 PouchDB(或 CouchDB)获取随机文档
【发布时间】:2015-02-15 06:56:10
【问题描述】:

我正在使用 Angular 和 Ionic 设计一个测验应用程序。我有大约 2000 个 json 格式的问题,我选择 PouchDB 作为数据库。 CouchDB 非常适合我:我可以在服务器上添加新问题,并且应用程序自动更新问题和答案。

但我现在有一个疑问:我找不到从 Pouch 获取随机文档的方法。使用我的应用程序,我将从某些选定的部分生成测验,并且我必须从我的数据库中获取可变数量的文档。

我正在使用db.allDocs([options], [callback]) api,我可以设置一个限制,但我找不到获取随机文档的方法。

有什么解决办法吗?

【问题讨论】:

    标签: angularjs couchdb pouchdb


    【解决方案1】:

    @nlawson 给出的第一个解决方案并不总是有效,例如我必须删除获取的每个文档,所以我丢失了 ID 序列,例如:

    我有一个 ID 为 1 到 5 的文档列表

    1- 随机为 3

    2- 获取 id 为 3 的文档

    3- 删除 id 为 3 的文档 数据库状态[1,2,4,5]

    4- 如果 random 不是 3 重复上述步骤,但如果 random 是 3 或任何 id 已删除它会导致问题,所以这个解决方案不起作用,所以我找到了另一个解决方案:

    回答:

    使用Mango queriefind() 和这段代码

    let rand = Math.floor(Math.random() * (max - min + 1)) + min;
    
    db.find({
       selector: {_id: {$gte : '1'}},
       limit : 1,
       skip : rand-1,
    });
    

    首先我得到一个随机数,最大值是我数据库中的文档数,最小值是 1 作为第一个文档的第一个 ID。

    之后我执行 find() 查询以选择 id 大于或等于 1(基本上全部)的文档,将查询限制为仅检索第一个并开始从 rand-1 检索。

    要重用 rand 等于 3 的第一个示例,它将是这样的:

    1- 获取 ID 大于等于 1 的所有文档 => [1,2,3,4,5]

    2- 从 rand-1 开始,女巫是 3-1=2 获得有限数量的文件,限制是 1 => [2]

    所以它总是会返回位于 rand 位置的文档。

    PS:要使用 find(),你必须在 pouch 顶部安装这个库 pouchdb.find.js

    【讨论】:

    • 我发现在选择器中使用跳过/限制大约需要半秒才能从数据库中选择一个随机文档。数据库中有多少文档并不重要(我尝试了多达 1500 个)。如果你想得到其中的几个,那就太长了。我的解决方案是快速获取所有文档 ID 的列表(使用 mango find)并从中选择随机 ID。如果添加或删除了文档,我会再次获得该列表。注意:我的项目是 React Native with PouchDb+SQLite。
    【解决方案2】:

    你可以

    1. 给您的文档一个 _id '1'、'2'、'3' 等,然后随机使用 Math.random()get() 一个。

    2. 或者您可以使用 bulkDocs 读取所有 ID,然后随机选择一个到 get(),但如果您有很多文档,这可能会影响性能:

    db.allDocs().then(function (res) {
      var ids = res.rows.map(function (row) { return row.id; });
      var index = Math.floor(Math.random() * ids.length);
      return db.get(ids[index]);
    }).then(function (randomDoc) {
      // you got a randomDoc
    }).catch(console.log.bind(console))
    

    【讨论】:

    • 谢谢。每个文档都有一个 ID,但我还需要一个过滤器。例如,我需要 30 个具有特定值的随机文档,所以我不能使用这种方法,因为 Id 1,3,6 属于一个类别,而 2,4,5 属于另一个。我想我必须切换到 SQLite
    • 为此,您可以使用queries 以及相同的逻辑。 WebSQL 很棒,但请记住,您的 Ionic 应用程序只能在 Android/iOS 上运行(即不能在 Windows Phone、Firefox OS 等上运行)。
    • 对我来说,当我使用第一种方法获得一个随机文档时,我需要删除此条目,因此我丢失了 id 序列,因此我无法使用第一种方法
    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多