mongoose架构设计问题

时间:2015-07-14 18:42:49

标签: node.js mongodb mongoose

让我们说有一篇文章,你可以对文章发表评论,其他人可以回复你的评论,你甚至可以收到回复。您可以针对回复的每个评论/回复/回复接收上/下投票。

我想要检索数据的方式就像两个最高投票评论将是第一个,在最新到最旧的订单之后。非常像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": []
}

我也不知道怎么穿。饿了这将是排序。我可能应该以正确的日期顺序插入每个文档,所以当我运行查询时,我只需要挑选两个投票最多的评论并插入到顶部。

0 个答案:

没有答案
相关问题