【问题标题】:Order by Rand - How can I do in CouchDB?按 Rand 订购 - 我如何在 CouchDB 中进行操作?
【发布时间】:2011-02-17 11:04:30
【问题描述】:

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

【问题讨论】:

    标签: random couchdb


    【解决方案1】:

    我已经在我的视图键中使用 Math.random()。但是您必须了解它是确定性的,因此您不能将其用于应用程序中的随机性(仅用于采样数据或拆分数据库之类的事情。)

    【讨论】:

    • 也许改进是发出doc._rev.match(/^\d+-(\w+)$/)[1],即修订属性的校验和部分?
    【解决方案2】:

    基本策略是:

    1. 在文档中存储一个随机值

      { "_id": "7a36b03f3f2899064a1db5e0a6004204",
        "random": 0.875111079382808
      }
      

      您可以在存储文档时计算random,也可以使用_update 函数为您添加它。

    2. 制作一个以该值为键的视图,有效地洗牌。

      { "_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);
              }
            }
          }
        }
      }
      
    3. 在查询时选择一个随机数,例如0.4521 和 GET /db/_design/myapp/_view/random_docs?limit=1&startkey=0.4521

    您有机会 (1 / total_rows) 选择一个比视图中任何值都大的随机数。所以如果你需要防弹,如果你得到 0 行,你应该重新运行查询。

    【讨论】:

    • 也许,也可以使用 endkey 参数,以避免重新运行查询。
    猜你喜欢
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多