Asp.net 从mongodb文档中选择记录的正确方法是什么

Asp.net 从mongodb文档中选择记录的正确方法是什么,asp.net,mongodb,database,nosql,Asp.net,Mongodb,Database,Nosql,我是mongodb的新手,我非常喜欢noSql的想法 我正在尝试建立一个博客,在这里,人们可以在每条评论上单击“评分”按钮,并对该人的评论进行评分 在每个评论中,我有一个投票数组,其中有一个投票类型和唯一的IP。 每个用户单击按钮将插入行(每个IP一次) 最后,我想查询文档/帖子,并获取以下结构中的信息:计算选票、不同的VoteType、标题和计数 我要检索的结果 { PostTitle:"This is a blog post", Posted:"12/12/2012",

我是mongodb的新手,我非常喜欢noSql的想法

我正在尝试建立一个博客,在这里,人们可以在每条评论上单击“评分”按钮,并对该人的评论进行评分

在每个评论中,我有一个投票数组,其中有一个投票类型和唯一的IP。 每个用户单击按钮将插入行(每个IP一次)

最后,我想查询文档/帖子,并获取以下结构中的信息:计算选票、不同的VoteType、标题和计数

我要检索的结果

{ PostTitle:"This is a blog post", Posted:"12/12/2012", ByUsertId:"2", Body:"This is a simple body" Comments: [ { PostedBy:"someUser", Text:"Hi There!", CalculatedVotes: [ { VoteType:"AGREE", Caption="I agree!", Count:2 }, { VoteType:"NOT_AGREE", Caption="No Way!", Count:1 }, ] }, { PostedBy:"someUser2", Text:"Whats up?", CalculatedVotes: [ { VoteType:"AGREE", Caption="I agree!", Count:1 }, { VoteType:"NOT_AGREE", Caption="No Way!", Count:2 }, ] } ] } { PostTitle:"This is a blog post", Posted:"12/12/2012", ByUsertId:2, Body:"This is a simple body" Comments: [ { PostedBy:"someUser", Text:"Hi There!", Votes: [ { VoteType:"AGREE", Caption="I agree!", IP:"1.1.1.1" }, { VoteType:"NOT_AGREE", Caption="No Way!", IP:"2.2.2.2" }, { VoteType:"AGREE", Caption="I agree!", IP:"3.3.3.3" } ] }, { PostedBy:"someUser2", Text:"Whats up?", Votes: [ { VoteType:"NOT_AGREE", Caption="No Way!", IP:"1.1.1.1" }, { VoteType:"NOT_AGREE", Caption="No Way!", IP:"2.2.2.2" }, { VoteType:"AGREE", Caption="I agree!", IP:"3.3.3.3" } ] } ] } { 博文标题:“这是一篇博客文章”, 张贴:“12/12/2012”, ByUsertId:“2”, 身体:“这是一个简单的身体” 评论: [ { 发帖人:“某个用户”, 文字:“你好!”, 计算选票: [ { VoteType:“同意”, Caption=“我同意!”, 计数:2 }, { VoteType:“不同意”, Caption=“不行!”, 计数:1 }, ] }, { 发帖人:“someUser2”, 文字:“怎么了?”, 计算选票: [ { VoteType:“同意”, Caption=“我同意!”, 计数:1 }, { VoteType:“不同意”, Caption=“不行!”, 计数:2 }, ] } ] } 文档结构

{ PostTitle:"This is a blog post", Posted:"12/12/2012", ByUsertId:"2", Body:"This is a simple body" Comments: [ { PostedBy:"someUser", Text:"Hi There!", CalculatedVotes: [ { VoteType:"AGREE", Caption="I agree!", Count:2 }, { VoteType:"NOT_AGREE", Caption="No Way!", Count:1 }, ] }, { PostedBy:"someUser2", Text:"Whats up?", CalculatedVotes: [ { VoteType:"AGREE", Caption="I agree!", Count:1 }, { VoteType:"NOT_AGREE", Caption="No Way!", Count:2 }, ] } ] } { PostTitle:"This is a blog post", Posted:"12/12/2012", ByUsertId:2, Body:"This is a simple body" Comments: [ { PostedBy:"someUser", Text:"Hi There!", Votes: [ { VoteType:"AGREE", Caption="I agree!", IP:"1.1.1.1" }, { VoteType:"NOT_AGREE", Caption="No Way!", IP:"2.2.2.2" }, { VoteType:"AGREE", Caption="I agree!", IP:"3.3.3.3" } ] }, { PostedBy:"someUser2", Text:"Whats up?", Votes: [ { VoteType:"NOT_AGREE", Caption="No Way!", IP:"1.1.1.1" }, { VoteType:"NOT_AGREE", Caption="No Way!", IP:"2.2.2.2" }, { VoteType:"AGREE", Caption="I agree!", IP:"3.3.3.3" } ] } ] } { 博文标题:“这是一篇博客文章”, 张贴:“12/12/2012”, ByUsertId:2, 身体:“这是一个简单的身体” 评论: [ { 发帖人:“某个用户”, 文字:“你好!”, 投票: [ { VoteType:“同意”, Caption=“我同意!”, IP:“1.1.1.1” }, { VoteType:“不同意”, Caption=“不行!”, IP:“2.2.2.2” }, { VoteType:“同意”, Caption=“我同意!”, 知识产权:“3.3.3.3” } ] }, { 发帖人:“someUser2”, 文字:“怎么了?”, 投票: [ { VoteType:“不同意”, Caption=“不行!”, IP:“1.1.1.1” }, { VoteType:“不同意”, Caption=“不行!”, IP:“2.2.2.2” }, { VoteType:“同意”, Caption=“我同意!”, 知识产权:“3.3.3.3” } ] } ] }
我认为最好是重新考虑你的模式。描述了存储层次结构的一个很好的示例

在您的模式中,您将遇到多个问题,其中最重要的一个问题是,如果讨论时间过长,您将得到一个最终将超过最大文档大小(16MB)的巨大文档。此外,您将只需要获取部分文档,但即使您不需要,您也将始终获得大量完整的讨论(并且很难根据嵌入结构的深度进行过滤)


最后但并非最不重要,处理计票的最佳方法是在记录选票时实时增加选票数,以避免重新计算选票的开销,这还有一个额外的好处,您可以按选票排序,甚至根据选票索引(如果需要)。

我希望您不要期望有太多的评论,因为如果需要,您的博客文章文档将膨胀始终将所有内容嵌入其中。仅仅因为它是noSQL并不意味着有些东西不应该存储在它们自己的单独集合中。谢谢你,你对实时增加投票计数的看法是正确的,但是如何防止不唯一的点击?你可以对投票人的ip和博客帖子的id进行唯一的限制。因此每个ip只能为每个博客投票一次。。。我相信还有其他方法可以做到这一点。