Post 是否可以将数据发布到Coach db并返回数据?

Post 是否可以将数据发布到Coach db并返回数据?,post,couchdb,Post,Couchdb,例如,我希望将用户分数发送到数据库,而不是返回典型状态,id和rev我希望它返回用户排名。我猜这是不可能的,但我想我会问。如果可以通过http请求从要更改的文档中计算结果,那么您可以使用更新处理程序对文档进行更改,并返回结果: // 'myhandler' update function function(doc, req) { // create a shorthand for json reponses var json_reponse = function(obj, code) {

例如,我希望将用户分数发送到数据库,而不是返回典型状态,id和rev我希望它返回用户排名。我猜这是不可能的,但我想我会问。

如果可以通过http请求从要更改的文档中计算结果,那么您可以使用更新处理程序对文档进行更改,并返回结果:

// 'myhandler' update function
function(doc, req) {
  // create a shorthand for json reponses
  var json_reponse = function(obj, code) {
    return { 
        headers: { 'Content-Type': 'application/json' }
      , body: JSON.stringify(obj) 
      , code: code
      }
  }

  // assume the incoming body is json and parse it
  // needs proper error handling still
  var body = JSON.parse(req.body)

  // doc is the user document we are patching
  // return an error if it isn't there
  if(!doc) 
    return [null, json_response({error: 'user document not found'}, 404)]

  // return an error if new_score is missing from body
  if(!body.new_score) 
    return [null, json_response({error: 'missing property new_score'}, 400)

  // now patch the user doc
  doc.score = body.new_score

  // calculate the new rank depending on your own method
  var my_rank = my_rank_function(doc.score, Math.PI, 'bananarama')

  return [doc, json_response({success: true, rank: my_rank}, 200)
}
现在
PUT
新数据以接收新排名:

request(
  { method: 'PUT'
  , url: httptp://127.0.0.1:5984/mydb/_design/myddoc/_update/myhandler/myuserdocid
  , json: {"new_score": 42}
  , headers: { "Content-Type: application/json" }
  }
, function(err, response, body) {
    console.log("user's new rank:", JSON.parse(body).rank)
  }
)
应打印
用户的新职级:11级80年代女孩组长


注意:我不在工作,因此无法确认代码是否正常工作,但您应该了解它的诀窍…

对HTTP POST/PUT的响应实际上应该只用于帮助您确认它是否成功

我甚至很难看到如何获得couchdb视图返回的用户的排名,除非检索所有用户的数据并计算出用户的位置

这个用例

  • 简单的结构化数据,清晰的表格
  • 快速响应数字列的要求(计算分数排名的方法)
  • 或者每次提交排名时触发更新评分表的要求

。。。闻起来很像一个经典案例,您可能想要使用关系数据库

我目前正在使用一个视图获取用户排名,该视图统计得分低于用户当前得分的记录数。我从mysql切换到couchdb,因为mysql数据库上的读/写操作数量太多,无论我如何扩展服务器,都会使我的服务器瘫痪。我的大部分问题都是读取,根据我所做的所有研究,读取应该比mysql快一点,但写入实际上要慢一点。我打算将它发布到一个实时场景中,对它进行测试,看看哪一个性能更适合我的需要。如果您需要一条Id为的记录,那么如果您使用的
WHERE
子句没有备份好的索引,或者索引需要不断重写,那么couchdb可能比MySQL更快。如果您不需要MySQL中绝对最新的数据,您可以将新分数添加到临时表(无索引等),并按照每几分钟到几小时触发一次的计划将所有结果拉到索引表中。然后根据对该索引表的查询提供结果。我认为90%的调用是对单个用户的读取,其中我知道id。8%是对用户的更新,其中我知道id,其余是按分数排序的前50名用户的列表。因此,如果索引关系表的写入性能是一个问题,然后,您可以只对一个完全没有索引的表进行写入(我假设分数),每隔几分钟将它们添加到一个表中,在该表中存储用户的最佳分数,分数上有一个索引。看起来用户数据也不需要太多的索引,所以这里的更新应该很便宜。最后,如果你想让分数包含玩家的最新游戏分数,那么你只需将其存储在客户端应用程序中,并将其添加到客户端的前50名分数中。