兰德订购 - 我怎么能在CouchDB中做?

Luc*_*nan 7 random couchdb

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

J C*_*s A 8

我在视图键中使用了Math.random().但你必须明白它是确定性的,所以你不能在你的应用程序中使用它来随机化(只是为了采样数据或拆分数据库).

  • 也许改进是发出`doc._rev.match(/ ^\d + - (\ w +)$ /)[1]`,即修订属性的校验和部分? (3认同)

Jas*_*ith 7

一个基本策略是:

  1. 在文档中存储随机值

    { "_id": "7a36b03f3f2899064a1db5e0a6004204",
      "random": 0.875111079382808
    }
    
    Run Code Online (Sandbox Code Playgroud)

    您可以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);
            }
          }
        }
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在查询时选择一个随机数,例如0.4521和GET /db/_design/myapp/_view/random_docs?limit=1&startkey=0.4521.

您有可能(1/total_rows)选择一个大于视图中任意值的随机数.因此,如果您需要防弹,如果您获得0行,则应重新运行查询.

  • 也许,也可以使用endkey参数,以避免重新运行查询. (2认同)