我正在设计一个带有Angular和Ionic的测验应用程序。我有大约2000个json格式的问题,我选择PouchDB作为数据库。 CouchDB非常适合我:我可以在服务器上添加新问题,并在应用程序中自动更新问题和答案。
但我现在有一个疑问:我找不到从Pouch获取随机文档的方法。使用我的应用程序,我将从一些选定的部分生成测验,我必须从我的数据库中获取可变数量的文档。
我使用db.allDocs([options], [callback])
api,我可以设置限制,但我找不到获取随机文档的方法。
有没有解决方案?
答案 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”,“2”,“3”等,然后随机使用_id
至Math.random()
。
或者您可以使用bulkDocs读取所有ID,然后随机选择一个到get()
,但如果您有大量文档,这可能对性能有害:
get()