Angularjs 从PockDB(或CouchDB)获取随机文档
我正在设计一个带有Angular和Ionic的测验应用程序。我有大约2000个json格式的问题,我选择PockDB作为数据库。CouchDB非常适合我:我可以在服务器上添加新问题,应用程序自动更新问题和答案 但我现在有一个疑问:我找不到一种从邮袋中随机获取文档的方法。使用我的应用程序,我将从一些选定的部分生成测验,并且我必须从数据库中获取可变数量的文档 我使用的是Angularjs 从PockDB(或CouchDB)获取随机文档,angularjs,couchdb,pouchdb,Angularjs,Couchdb,Pouchdb,我正在设计一个带有Angular和Ionic的测验应用程序。我有大约2000个json格式的问题,我选择PockDB作为数据库。CouchDB非常适合我:我可以在服务器上添加新问题,应用程序自动更新问题和答案 但我现在有一个疑问:我找不到一种从邮袋中随机获取文档的方法。使用我的应用程序,我将从一些选定的部分生成测验,并且我必须从数据库中获取可变数量的文档 我使用的是db.allDocs([options],[callback])api,我可以设置一个限制,但是我找不到一种方法来获取随机文档 有什
db.allDocs([options],[callback])
api,我可以设置一个限制,但是我找不到一种方法来获取随机文档
有什么解决办法吗?你可以
\u id,然后使用Math.random()
随机获取一个
get()
,但如果您有大量文档,这可能会对性能造成不利影响:@nlawson给出的第一个解决方案并不总是有效,例如,我必须删除获取的每个文档,因此我丢失了ID序列,例如: 我有一个ID为1到5的文档列表 1-随机数是3 2-获取id为3的文档 3-删除id为3的文档 数据库状态[1,2,4,5] 4-如果random不是3,请重复上述步骤,但如果random是3或任何id已被删除,则会导致问题,因此此解决方案不起作用,因此我找到了另一个解决方案,即: 回答: 将find()与以下代码一起使用
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为great或等于1(基本上为all)的文档,将查询限制为仅检索第一个文档,然后开始从rand-1检索
要使用rand equal 3重复使用我们的第一个示例,它将类似于:
1-获取ID为great或等于1的所有文档
=>[1,2,3,4,5]
2-从rand-1开始,开关为3-1=2,获得有限数量的文件,限制为1
=>[2]
因此,它将始终返回位置rand上的文档
注意:要使用find(),您必须在小袋顶部安装此库backdb.find.js谢谢。每个文档都有一个id,但我还需要一个过滤器。例如,我需要30个具有特定值的随机文档,因此我无法使用此方法,因为Id 1,3,6属于一个类别,而Id 2,4,5属于另一个类别。我想我必须切换到SQLite。为此,您可以使用相同的逻辑。WebSQL很棒,但请记住,你的Ionic应用程序只能在Android/iOS上运行(即不是Windows Phone、Firefox OS等)。对于我来说,当我使用第一种方法获得随机文档时,我需要删除此条目,因此,我丢失了ID序列,因此无法使用第一种方法。我发现,在选择器中使用skip/limit大约需要半秒钟的时间从数据库中选择一个随机文档。数据库中有多少文档并不重要(我尝试了1500个文档)。如果你想得到一些,时间就太长了。我的解决方案是快速获取所有文档ID的列表(使用mango find)并从中随机选取ID。如果文档被添加或删除,我会再次获得列表。注意:我的项目是React原生的,带有backdb+SQLite。
let rand = Math.floor(Math.random() * (max - min + 1)) + min;
db.find({
selector: {_id: {$gte : '1'}},
limit : 1,
skip : rand-1,
});