为mongoose模式使用自定义ID

为mongoose模式使用自定义ID,mongoose,Mongoose,我想知道是否有一种很好的方法可以为模式分配自定义的用户友好ID。我希望我自己的ID类似于“1234”,而不是mongoose自动分配的ObjectID。我正在创建的应用程序是一个任务管理应用程序,因此我希望创建的每个任务都有一个易于阅读的id,可以在搜索框中输入该id,然后将其带到该特定任务 我的模式 var tickitSchema = Schema({ title : String, description : String, completed

我想知道是否有一种很好的方法可以为模式分配自定义的用户友好ID。我希望我自己的ID类似于“1234”,而不是mongoose自动分配的ObjectID。我正在创建的应用程序是一个任务管理应用程序,因此我希望创建的每个任务都有一个易于阅读的id,可以在搜索框中输入该id,然后将其带到该特定任务

我的模式

var tickitSchema = Schema({
title               : String,
description         : String,
completed           : Boolean,
priority            : Number,
category            : Number,
customId            : {type: Schema.Types.ObjectId, ref: 'TickitNumber'}, 
updatedAt           : {type: Date},
author              : { 
    type            : Schema.Types.ObjectId, 
    ref             : 'User' 
},
comments            : [{
    body            : String,
    by              : {
       type         : Schema.Types.ObjectId,
       ref          : 'User'
    }
}],
boardToBeDisplayedOn: [{
    type            : Schema.Types.ObjectId,
    ref             : 'Board'
}]
})

然后在我的服务器端API节点/express上,我有一个创建任务的函数

exports.create = function(req, res, next) {
  var tickit = Tickit(req.body);
  tickit.category = 1;
  for(i = 0; i < TickitNumber.length; i++) {
    var tn = TickitNumber[i] + 1;
  }
  if(!req.body.title) {
    res.status(400);
    res.send('Title is required');
  } else {
  var data = [];
  tickit.author = req.user;
  tickit.boardToBeDisplayedOn = req.user.ownsBoard;
  tickit.customId = tn;

  tickit.save(function (err, tickit) {
    if (err || tickit === null) { return res.send(err || new Error('Tickit was not saved but there was no error...odd')); }
    async.parallel([
      function(callback) {
        User.findByIdAndUpdate(req.user.id, {$push: {userTickits: tickit}}, {new: true}, function (err, user) {
          if (err) return callback(err);
          data.push(tickit);
          callback();// or whatever else you want to send
        })
      },

      function(callback) {
        Board.findByIdAndUpdate(tickit.boardToBeDisplayedOn,{$push: {boardTickits: tickit}}, {new:true}, function(err, board){
          if(err) return res.send(err) ;
          data.push(board);
          callback();
        })
      }
    ], function(err) {
        if(err) return next(err);

        res.status(201);
        res.json(tickit);
      });
  });
}  
}

如果有人知道一个更好的方法来做这件事或者改进我已经做过的事情,那将是非常有帮助的,谢谢

如果您只打算在单个instanceserver上运行此功能,则可能不会遇到任何问题。但是,当您开始有多个实例更新同一个数据库或数据库集群时,您将遇到这种id生成的竞争条件。最好让_id成为ObjectId,然后再创建一个具有用户友好id的字段,并在其上创建索引。它将只是一个实例。我应该提到,我仍将使用_id作为ObjectID,但我确实希望有一个用户可以使用的辅助id。例如,用户可以创建一个任务,并通过提供该ID将其与现有任务关联起来。我使用上述代码是否正确?我已经和邮递员一起测试了这个方法,但是我得到了一个cast错误。
exports.create = function(req, res, next) {
  var tickit = Tickit(req.body);
  tickit.category = 1;
  for(i = 0; i < TickitNumber.length; i++) {
    var tn = TickitNumber[i] + 1;
  }
  if(!req.body.title) {
    res.status(400);
    res.send('Title is required');
  } else {
  var data = [];
  tickit.author = req.user;
  tickit.boardToBeDisplayedOn = req.user.ownsBoard;
  tickit.customId = tn;

  tickit.save(function (err, tickit) {
    if (err || tickit === null) { return res.send(err || new Error('Tickit was not saved but there was no error...odd')); }
    async.parallel([
      function(callback) {
        User.findByIdAndUpdate(req.user.id, {$push: {userTickits: tickit}}, {new: true}, function (err, user) {
          if (err) return callback(err);
          data.push(tickit);
          callback();// or whatever else you want to send
        })
      },

      function(callback) {
        Board.findByIdAndUpdate(tickit.boardToBeDisplayedOn,{$push: {boardTickits: tickit}}, {new:true}, function(err, board){
          if(err) return res.send(err) ;
          data.push(board);
          callback();
        })
      }
    ], function(err) {
        if(err) return next(err);

        res.status(201);
        res.json(tickit);
      });
  });
}  
}