首先要说明我是MongoDb和面向文档的数据库的新手。
在mongodb中嵌入文档出现问题后(无法仅选择嵌套文档(博客文章中的单个评论示例)), 我重新设计了数据库。现在我有两个收藏,帖子和评论(不是真正的交易,为了方便起见,使用博客示例)。
示例 - 发布集合文档:
数组{
'_id' : MongoId,
'title' : 'Something',
'body' : 'Something awesome'
}
示例 - 评论文件:
数组{
'_id' : MongoId,
'postId' : MongoId,
'userId' : MongoId,
'commentId' : 33,
'comment' : 'Punch the punch line!'
}
正如您所看到的,我有多个评论文档(正如我之前所说的,我希望能够选择单个评论,而不是它们的数组)。
我的计划是:我想使用postId和commentId从集合中选择单个注释(commentId仅在具有相同postId的注释中具有唯一值)。 哦,commentId需要是一个int,以便我能够使用该值来计算下一个和以前的文档,排序" orderWith"号。
现在我可以得到这样的评论:
URI:mongo.php?post = 4de526b67cdfa94f0f000000& comment = 4
代码:$ comment = $ collection-> findOne(数组(" postId" => $ theObjId," commentId" =>(int)$ commentId));
我有几个问题。
答案 0 :(得分:3)
我做得对吗?
这是一个非常棘手的问题。它有用吗?它是否满足您的性能需求,您是否愿意维护它?
MongoDB没有任何“规范化”或“真正的方式”的概念。您可以按照适合自己的方式为数据建模。
生成这种评论的最佳方法是什么? 确保commentId在具有相同postId(upsert?)的注释中是唯一的最佳方法是什么?
这确实是一个复杂的问题。如果要生成单调递增的整数ID(如自动递增),则需要一个中央权限来生成这些整数。这不会很好地扩展。
通常建议的方法是使用ObjectId / MongoId。这将为您提供一个唯一的ID。
但是,你真的想要一个整数。所以看看findAndModify。您可以在帖子上保留“last_comment_id”,然后在创建新评论时对其进行更新。
如何处理并发查询?
为什么并发查询会成为问题?两位读者应该能够访问相同的数据。
您是否担心会创建并发评论?然后查看查找修改文档。
答案 1 :(得分:2)
我不知道大画面是否会允许你这样做,但这是我如何做到的。
每个帖子里面都有一系列评论。这意味着不需要连接。在您的情况下,评论的规范化不会带来任何好处。我会将CommentID
替换为CreatedAt
作为创建时间。
这将使您可以使用简单的数据模型,以及对其进行排序的功能。