Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 从PockDB(或CouchDB)获取随机文档_Angularjs_Couchdb_Pouchdb - Fatal编程技术网

Angularjs 从PockDB(或CouchDB)获取随机文档

Angularjs 从PockDB(或CouchDB)获取随机文档,angularjs,couchdb,pouchdb,Angularjs,Couchdb,Pouchdb,我正在设计一个带有Angular和Ionic的测验应用程序。我有大约2000个json格式的问题,我选择PockDB作为数据库。CouchDB非常适合我:我可以在服务器上添加新问题,应用程序自动更新问题和答案 但我现在有一个疑问:我找不到一种从邮袋中随机获取文档的方法。使用我的应用程序,我将从一些选定的部分生成测验,并且我必须从数据库中获取可变数量的文档 我使用的是db.allDocs([options],[callback])api,我可以设置一个限制,但是我找不到一种方法来获取随机文档 有什

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

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

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

有什么解决办法吗?

你可以

  • 为您的文档提供一个'1'、'2'、'3'等的
    \u id,然后使用
    Math.random()
    随机获取一个

  • 或者,您可以使用bulkDocs读入所有ID,然后随机选择一个以
    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,
    });