让我们说有一篇文章,你可以对文章发表评论,其他人可以回复你的评论,你甚至可以收到回复。您可以针对回复的每个评论/回复/回复接收上/下投票。
我想要检索数据的方式就像两个最高投票评论将是第一个,在最新到最旧的订单之后。非常像youtube视频评论系统。
我提出了一个非常奇怪的架构(在我看来),我想验证它是否可以做得更好。
var articleSchema = new Schema({
title: { type: String, trim: true, required: true, max: 16, min: 1 },
body: { type: String, trim: true, required: true, max: 2000, min: 1 },
author: { type: Schema.ObjectId, ref: 'User', required: true },
votes: [{ type: Schema.ObjectId, ref: 'User' }],
tags: { type: [], get: getTags, set: setTags },
createdAt: { type: Date, default: Date.now, get: getDate },
updatedAt: { type: Date, default: Date.now, get: getDate },
comments: [{
body: { type: String, trim: true, required: true, max: 2000, min: 1 },
author: { type: Schema.ObjectId, ref: 'User', required: true },
likes: [{ type: Schema.ObjectId, ref: 'User' }],
likesCount: { type: Number, 'default': 0 },
createdAt: { type: Date, default: Date.now, get: getDate },
updatedAt: { type: Date, default: Date.now, get: getDate },
replies: [{
body: { type: String, trim: true, required: true, max: 2000, min: 1 },
author: { type: Schema.ObjectId, ref: 'User', required: true },
likes: [{ type: Schema.ObjectId, ref: 'User' }],
likesCount: { type: Number, 'default': 0 },
createdAt: { type: Date, default: Date.now, get: getDate },
updatedAt: { type: Date, default: Date.now, get: getDate },
replies: [{
body: { type: String, trim: true, required: true, max: 2000, min: 1 },
author: { type: Schema.ObjectId, ref: 'User', required: true },
likes: [{ type: Schema.ObjectId, ref: 'User' }],
likesCount: { type: Number, 'default': 0 },
createdAt: { type: Date, default: Date.now, get: getDate },
updatedAt: { type: Date, default: Date.now, get: getDate }
}]
}]
}]
});
哈哈:P你可以看到comments / replies / replies.replies
完全相同。我认为它可以递归完成,但我确实希望保留响应数据的形状如下:(没有任何性能饥饿的对象修改)
{
"_id": "55a549ba15bc2ae3098693c7",
"author": { '.': '.' },
"title": "test",
"body": "test 2",
"comments": [{
"body": "asd",
"author": { '.': '.' },
"_id": "55a54b20c2dd34d41a98ffff",
"replies": [{
"body": "bsd",
"author": { '.': '.' },
"_id": "55a54ba45eec5a4321e842ae",
"updatedAt": "2015-07-14T17:49:24.500Z",
"createdAt": "2015-07-14T17:49:24.500Z",
"likesCount": 0,
"likes": [],
"replies": [{
"body": "bsd",
"author": { '.': '.' },
"_id": "55a54ba45eec5a4321e842ae",
"updatedAt": "2015-07-14T17:49:24.500Z",
"createdAt": "2015-07-14T17:49:24.500Z",
"likesCount": 0,
"likes": []
}]
}],
"updatedAt": "2015-07-14T17:47:12.383Z",
"createdAt": "2015-07-14T17:47:12.383Z",
"likesCount": 0,
"likes": []
}],
"updatedAt": "2015-07-14T17:41:14.877Z",
"createdAt": "2015-07-14T17:41:14.877Z",
"tags": [""],
"votes": []
}
我也不知道怎么穿。饿了这将是排序。我可能应该以正确的日期顺序插入每个文档,所以当我运行查询时,我只需要挑选两个投票最多的评论并插入到顶部。