1

我正在看这篇文章,因为我想用 Nodejs 和 MongoDB 创建一个评论系统:

https://docs.mongodb.org/ecosystem/use-cases/storing-comments/

本文中提到的评论系统有3种实现方法,第一种方法是将评论保存为单个文档。

在第一种方法中,文章对将要保存在 MongoDB 中的每个评论使用“slug”(例如,“34db”)。这个“slug”是用来对评论进行排序的,所以它必须是唯一的。

我的问题是,考虑到在创建评论时,评论的 _id(MongoDB 将 Object.id 自动分配给保存的对象)是未知的,我们如何为评论创建这样一个独特的“slug”我们要拯救吗?

在上面提到的文章中,它使用了一个名为“generate_pseudorandom_slug()”的伪方法。我想知道我们如何在实际情况中实现这样的方法,以获得像“34db”这样的独特的评论?

谢谢!

4

1 回答 1

0

我知道这是旧帖子,但这是我的解决方案,它采用了启发使用的功能。它用于线程注释,并收集了引用的 MongoDB 文章中提供的概念。我的模型/comment.js 路径中有此代码,并且很可能会将 generateSlug() 函数拉出到 utils.js 文件中并将其重新导入。

function generateSlug() {

  let slug = '';
  let chars = 'abcdefghijklmnopqrstuvwxyz0123456789';

  for ( let i = 0; i < 5; i++ ) {
    slug += chars.charAt(Math.floor(Math.random() * chars.length));
  }

  return slug;
}

CommentSchema.pre('save', function (next) {
  let comment = this;
  let timestamp = moment(comment.postedAt).format('YYYY.MM.DD.hh:mm:ss');
  let slug_part = generateSlug();
  let full_slug_part = timestamp + ':' + slug_part;

  if ( comment.parent_id ) {
    Comment.findOne({'_id': comment.parent_id }, { slug: 1, full_slug: 1 })
      .then(parent => {
        comment.slug = parent.slug + '/' + slug_part;
        comment.full_slug = parent.full_slug + '/' + full_slug_part;
        next();
      });
  } else {
    comment.slug = slug_part;
    comment.full_slug = timestamp + ':' + slug_part;
    next();
  }
});
于 2018-01-15T04:24:56.313 回答