Random 按兰德订购-我在CouchDB怎么办?

Random 按兰德订购-我在CouchDB怎么办?,random,couchdb,Random,Couchdb,我需要一个随机查询,但我不知道在视图中执行此操作的最佳方法是什么。基本策略是: 在文档中存储一个随机值 { "_id": "7a36b03f3f2899064a1db5e0a6004204", "random": 0.875111079382808 } 您可以在存储文档时计算random,也可以使用\u update函数为您添加文档 将视图设置为该值的关键帧,有效地将其洗牌 { "_id": "_design/myapp", "comment": "Function left nake

我需要一个随机查询,但我不知道在视图中执行此操作的最佳方法是什么。

基本策略是:

  • 在文档中存储一个随机值

    { "_id": "7a36b03f3f2899064a1db5e0a6004204",
      "random": 0.875111079382808
    }
    
    您可以在存储文档时计算
    random
    ,也可以使用
    \u update
    函数为您添加文档

  • 将视图设置为该值的关键帧,有效地将其洗牌

    { "_id": "_design/myapp",
      "comment": "Function left naked for clarity; it should be a string",
      "views": {
        "random_docs": {
          "map": function(doc) {
            if(doc.random) {
              emit(doc.random, doc);
            }
          }
        }
      }
    }
    
  • 在查询时选择一个随机数,例如0.4521,然后获取
    /db/\u design/myapp/\u view/random\u docs?limit=1&startkey=0.4521


  • 有可能(1/total_行)您选择的随机数大于视图中的任意数。因此,如果需要防弹,如果得到0行,应该重新运行查询。

    我已经在视图键中使用了Math.random()。但是你必须明白它是确定性的,所以你不能在你的应用程序中使用它作为随机性(仅用于采样数据或分割数据库)。也许一个改进是发出
    doc.\u rev.match(/^\d+-(\w+)$/)[1]
    ,即修订属性的校验和部分?也许,还要使用endkey参数,以避免重新运行查询。