对于我的博客,我想在不依赖于默认的wordpress评论系统的情况下整合我自己的评论系统。我需要评论模块使用 mongodb 而不是 mysql ,模块需要支持以下内容:
在这种情况下,什么是在mongodb中表示数据的最佳方式?
答案 0 :(得分:4)
只需将评论存储在您的博客上即可。你想要线程/嵌套的评论?然后以嵌套方式存储它们:
postId: {
comments: [
{
id: "47cc67093475061e3d95369d" // ObjectId
title: "Title of comment",
body: "Comment body",
timestamp: 123456789,
author: "authorIdentifier",
upVotes: 11,
downVotes: 2,
comments: [
{
id: "58ab67093475061e3d95a684"
title: "Nested comment",
body: "Hello, this is a nested/threaded comment",
timestamp: 123456789,
author: "authorIdentifier",
upVotes: 11,
downVotes: 2,
comments: [
// More nested comments
]
}
]
},
{
// Another top-level comment
}
]
}
postId
指的是评论所属的博客文章,并且已被用作文档的密钥(或MongoDB中的_id
)。每条评论都有一个唯一的id
,以便对个别评论进行投票或评论。
要获得聚合投票,您需要在以下某处编写map-reduce函数:
function map() {
mapRecursive(this.comments)
}
function mapRecursive(comments) {
comments.forEach(
function (c) {
emit(comment.author, { upVotes: c.upVotes, downVotes: c.downVotes });
mapRecursive(c.comments);
}
);
}
function reduce(key, values) {
var upVotes = 0;
var downVotes = 0;
values.forEach(
function(votes) {
upVotes += votes.upVotes;
downVotes += votes.downVotes;
}
);
return { upVotes: upVotes, downVotes: downVotes };
}
我没有测试过这些函数,也没有检查null
值。这取决于你:)
答案 1 :(得分:1)
怎么样:
所有评论的单个集合。每个注释对象都包含对线程的父注释对象的引用,当然还包含对父级博客帖子的引用。
每个评论对象也有数字投票计数,可以使用mongo的原子更新进行更新。
用户的每次特定投票都将直接引用用户对象中的注释ID。