从PouchDB(或CouchDB)获取随机文档

时间:2014-12-16 20:38:56

标签: angularjs couchdb pouchdb

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

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

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

有没有解决方案?

2 个答案:

答案 0 :(得分:1)

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

我有一份包含1到5个ID的文档列表

1- random是3

2-获取标识为3的文档

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

4-如果随机是除了上面3个重复步骤之外的任何东西,但是如果随机是3或任何已经删除的ID它会导致问题,所以这个解决方案无效,所以我找到了另一个解决方案:

<强>解答:

使用Mango querie find(),使用此代码

let rand = Math.floor(Math.random() * (max - min + 1)) + min;

db.find({
   selector: {_id: {$gte : '1'}},
   limit : 1,
   skip : rand-1,
});

首先,我得到一个随机数,max是我数据库中的文档数,min是1,作为第一个文档的第一个id。

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

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

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

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

所以它总会在位置rand上返回文档。

P.S:要使用find(),你必须在这个库pouchdb.find.js

的pouch顶部安装

答案 1 :(得分:0)

你可以

  1. 为您的文档提供“{1}”的“1”,“2”,“3”等,然后随机使用_idMath.random()

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

  3. get()