我正在使用 django、backbone.js、tastypie 和 mongodb 开发一个网络应用程序。为了使 tastypie 和 django 适应 mongodb,我使用了 django-mongodb-engine 和 tastypie-nonrel。此应用程序有一个模型项目,其中有一个任务列表。所以它看起来像这样:
class Project(models.Model):
user = models.ForeignKey(User)
tasks = ListField(EmbeddedModelField('Task'), null=True, blank=True)
class Task(models.Model):
title = models.CharField(max_length=200)
感谢 tastypie-nonrel,通过/api/v1/project/:id:/tasks/的 GET 请求以简单的方式获取项目的任务列表
现在我想用评论列表扩展这个任务模型:
class Task(models.Model):
title = models.CharField(max_length=200)
comments = ListField(EmbeddedModelField('Comment'), null=True, blank=True)
class Comment(models.Model):
text = models.CharField(max_length=1000)
owner = models.ForeignKey(User)
此实现的问题是 tastypie-nonrel 不支持另一个嵌套,因此无法简单地将评论发布到/api/v1/project/:id:/task/:id:/comments/
另一种方法是只向/api/v1/project/:id:/task/发出任务的 PUT 请求,但如果两个用户决定同时向同一个任务添加评论,这会产生问题时间,因为最后一个 PUT 会覆盖前一个。
最后一个选项(除了更改 tastypie-nonrel 之外)是不在任务中嵌入 Comment 并只保留 ForeignKey,因此请求将转到/api/v1/Comment/。我的问题是这是否会破坏使用 MongoDB 的好处(因为它需要交叉查询)?有没有更好的方法呢?
我对堆栈的任何技术都没有什么经验,所以可能是我没有很好地关注问题。欢迎提出任何建议。
最佳答案
看来你嵌套太多了。也就是说,您可以为 tastypie 创建自定义方法/URL 映射,然后运行您自己的逻辑,而不是依赖于“自动魔术”tastypie。如果您担心评论覆盖问题,无论如何您都需要交易。然后,您的代码应该足够健壮以处理失败事务的行为,例如重试。如果您经常锁定具有许多写入器的大型对象,这肯定会极大地限制您的写入,但这也表明存在设计问题。
可以稍微缓解这种情况的一种方法是写入中间源,例如任务队列或 Redis,然后根据需要转储到注释中。这仅取决于您的解决方案的可靠性/耐用性。任务队列至少会处理失败事务的重试;使用 redis,您可以使用 pub/sub 做一些事情。
关于 MongoDB 的 IMO 设计,您应该考虑一些事情。
避免创建过大的单体对象。虽然这是 Mongo 的一个好处,但这取决于您的使用情况。例如,如果您总是将项目作为顶级对象返回,那么随着任务和评论的增长,仅网络流量就会降低性能。
想象一个非常人为的例子,其中项目特定 数据是 10k,单独每个任务是 5k,单独每个评论是 2k,如果你有一个项目有 5 个任务,每个任务 10 条评论,你说的是 10k + 5*5k + 10*2k。对于一个有很多评论的非常活跃的项目,这将是通过网络发送的大量内容。您可以执行切片/投影查询来协调这个问题,但有一些限制和影响。
根据上述推论,根据您的用例构建您的对象。如果您不需要将东西重新放在一起,它们可以在不同的集合中。仅仅因为您“认为”需要将它们重新组合在一起,并不意味着在实现方面需要在同一次提取中检索它们(尽管这通常是理想的)。
即使您在一个用例/屏幕中确实需要所有内容,在某些设计中可能采用的另一种解决方案是并行加载内容,甚至在页面加载后使用 AJAX 通过 JavaScript 延迟加载内容。例如,您可以在顶部加载任务信息,然后进行异步调用以单独加载评论,类似于 Disqus 或 Livefyre 在其他站点中作为集成工作的方式。这可能有助于在某种程度上解决您的嵌套问题,因为您可以摆脱任务/项目级别,只需在每个评论/记录上存储一些 ID,以便能够在集合之间进行查询。
请记住,您可能不想一次检索所有评论,如果您有很多评论,您可能会遇到一个文档大小的限制。这些天在最近版本的 Mongo 中大小更大,但是拥有大量数据的单个记录通常没有意义,回到上面的第一项。
我的建议是:
如果您担心丢失评论,请使用事务。
如果您担心#1 导致竞争写入和丢失东西,请添加一个任务队列/redis/一些持久的东西。如果没有,请忽略它。评论丢了是世界末日吗?
考虑将特别是评论重组为一个单独的集合,以缓解您的美味问题。如果需要,延迟加载或并行加载。
关于django - Tastypie-nonrel,django,mongodb : too many nestings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12521595/
我正在用RubyonRails重写Django应用程序,并希望为用户保留旧密码。Django使用PBKDF2SHA1作为加密机制。所以我有一个加密密码是这个pbkdf2_sha256$10000$YsnGfP4rZ1IZ$Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBPUgmunFOW4=原密码是2bulls在Ruby中,我使用PBKDF256gem和base64进行检查。Base64.encode64PBKDF256.dk("2bulls","YsnGfP4rZ1IZ",10000,32)我很期待Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBP
摘要本论文主要论述了如何使用Python技术开发一个短视频智能推荐,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述短视频智能推荐的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 短视频智能推荐的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、热门视频管理、用户上传管理、系统管理,用户:首页、个人中心、用户上传管理、我的收藏管理,前台首页;首页、热门视频、用户上传、公告信息、个人中心、后台管理等功能。由于本网站的功能模块设计比较全面,所以使得整个短视频智能推荐信
有没有办法为Sinatra获取DjangoAdmin风格的网络管理员? 最佳答案 没用过,但通过谷歌很快就显示出来了:http://www.padrinorb.com/ 关于ruby-SinatraWeb管理员(如Django管理员),我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2855494/
我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多
我必须在mongoid模型中添加几个字段,我知道MongoDB没有迁移,但如果我继续而不删除数据库,使rails完全“重新生成”数据库,它不会显示或使用新的领域!去这里最好的方法是什么?有比删除/重新打开mongodb更软的东西吗?提前致谢卢卡 最佳答案 一般来说,应该可以在运行时用新字段更新旧文档。MongoDB中不需要迁移。您可能想编写rake任务以使用新字段和默认值更新旧文档。您可以通过检查那些默认值为nil的新字段来找到这些文档。更新简单风格:如果您使用默认值定义一个新字段,只要您设置了一个新值,就应该始终使用该值:应用程序
我如何从Ruby代码连接到mongodb? 最佳答案 首先,您必须安装MongoDbgem:geminstallmongo然后运行代码:require'rubygems'#notnecessaryforRuby1.9require'mongo'db=Mongo::Connection.new.db("mydb")#ORdb=Mongo::Connection.new("localhost").db("mydb")#ORdb=Mongo::Connection.new("localhost",27017).db("mydb")
我正在尝试使用聚合框架(使用ruby)并像这样投影日期:db['requests'].aggregate([{"$project"=>{_id:0,method:'$method',user:'$user',year:{'$year'=>'$timestamp'}}}])文档是这样的:{_id:ObjectId("5177d7d7df26358289da7dfd"),timestamp:ISODate("2013-04-12T03:58:05+00:00"),method:"POST",status:"200",inputsize:"874",outputsize:"4981",u
我试图通过在Ruby中进行的查询从MongoDB获取字段的子集,但它似乎不起作用。它不返回任何结果这是ruby代码:coll.find("title"=>'Halo',:fields=>["title","isrc"])#thisdoesn'twork如果我删除字段散列,它会工作,返回包含所有字段的结果coll.find("title"=>'Halo')#thisworks查看mongodb控制台,第一个查询在mongodb服务器上结束,如下所示:{title:"Halo",fields:["title","isrc"]}如果我尝试从mongo客户端控制台进行查询,它会工作,我会得到结
我正在深入了解Jekyll,并希望将其用作通用前端开发平台,但遇到了Liquid模板语言的局限性,特别是它与Django模板的区别。我发现了liquid-inheritancegem,它添加了Django中最重要的Extends和Block语法。这篇博文进一步扩展了gem以适应Jekyll的文件系统:http://www.sameratiani.com/2011/10/22/get-jekyll-working-with-liquid-inheritance.html问题是它似乎没有以与Django完全相同的方式实现block,这实际上使gem变得无用。为了便于理解,我有两个名为par
我目前正在尝试在Rails和Django之间做出决定。目前我发现ruby更优雅,所以我考虑Django的唯一原因是管理面板..我没有任何经验,但我必须在截止日期前快速开发应用程序。Rails中是否有一种方法可以根据您的模型(如django中的管理面板)为您的所有CRUD操作生成一组(接近生产就绪的)View?(即它会查看您的模型并看到您有一个属于某个组的人,并在创建人员View上为该组生成一个下拉列表)?如果不是,那是获得所有CRUDView初稿的最快方法(无需手动编写)?谢谢,丹尼尔 最佳答案 有趣的工具http://acti