Post 是否可以将数据发布到Coach db并返回数据?
例如,我希望将用户分数发送到数据库,而不是返回典型状态,id和rev我希望它返回用户排名。我猜这是不可能的,但我想我会问。如果可以通过http请求从要更改的文档中计算结果,那么您可以使用更新处理程序对文档进行更改,并返回结果: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) {
// '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名分数中。