mongodb - Sinatra + MongoDB 导致 unRESTful API?

标签 mongodb rest http nosql

我使用了一个用 Sinatra 编写并使用非关系数据库 (MongoDB) 的网络服务 API。

有这样存储的东西:

article:{
    "title:"foo",
    "comments": ["first comment", "lolz", "fake comment"],
    "foo", "bar"
}

更新方法要求我再次发送所有具有修改值的数据。所以,如果我想添加评论,我需要发送:

article: {
    "title:"foo",
    "comments": ["first comment", "lolz", "fake comment", "another comment"],
    "foo", "bar"
}

这可能会导致数据丢失。例如:

Bob 在他的 iPhone 上获取了这篇文章。爱丽丝在她的 iPad 上收到了同样的文章。他们读了。 Bob 决定留下一个长评论。 Alice 留下了简短的评论并在 Bob(提出更新请求)之前完成。一段时间后 Bob 完成并发表评论 - 提出更新请求重写 Alice 的评论。

我认为这是一个问题。这样做的结果是一个新的 API 调用,用于向具有特定 ID 的文章添加评论 - 而不是再次发送所有现有参数。

这仍然不行(如果我确实更新了一个参数,我仍然必须发送数组)。我猜想在执行 POST 或 PUT 时,模型的数组字段不应该可用。 应该有另一个称为 URL 的资源(如果数据库中的模型保持不变,至少对于最终用户而言)。

我不知道这方面的好方法。

最佳答案

这只是一个示例 - 我不知道您使用的是 Mongoid 还是什么。这些都是即兴的,如果有什么不对的地方,我们深表歉意。

假设您有一个文章模型,其方法如下:

class Article
    # Stuff
    def add_comment(comment)
        @comments.push comment
    end
    # More stuff.
end

我不明白为什么不能有这样的路线:

post '/api/article/:article_id/comment/:comment' do
    # retrieve an article by its ID.
    article.add_comment params[:comment]
    article.save
end

即使您没有模型,也只是一个查询问题,例如:

article_collection.update(
    {_id: BSON::ObjectId.from_string(params[:article_id])},
    {"$push" => {comments: {params[:comment]}},
    {w: 1} # Or 0 if you like to live dangerously.
)

关于mongodb - Sinatra + MongoDB 导致 unRESTful API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17191344/

相关文章:

ruby - 如何在 Mongoid 中引用嵌入的文档?

RESTful API 运行时可发现性/HATEOAS 客户端设计

rest - 使用基于REST的API不能仅使用基于HTTP的API可以实现哪些功能/约束

java - 警告 : The (sub)resource method contains empty path annotation

php - 如何将 JSON 请求中的过滤器参数发送到 HBase REST API?

objective-c - RestKit 0.20 映射问题

apache - 虚假请求,证书审核员?

java - 如何在Hive中导入mongo数据?

mongodb - 如何在子属性上使用 $setIsSubset (或其他集合操作)

node.js - 应如何设置高需求应用程序的 node.js 堆栈?