2

我有一个标签模式(用猫鼬定义):

var Tag = new Schema({
  _id: String  // Not ObjectId but the name of the tag.
});

我想使用标签名称作为它的_id,但我不想用名称来操作这个字段_id。例如,我想添加一个带有代码的新标签,new Tag({name: 'tagA'})而不是new Tag({_id: 'tagA'}). 由于代码以这种方式更具表现力。

所以我需要更改name_id. 一种方法是使用预保存挂钩

Tag.pre('save', function(next) {
  if (!this._id && this.name) this._id = this.name;
  next();
});

有没有比这个更好的方法?

4

1 回答 1

0

这似乎是我在 mongoose 中找到的用于实现自定义主键的最佳选择。

<schemaToHook>.pre('save', true, function(next, done) {
   // trigger next middleware in parallel
   next();
   if (!this._id && this.name) {
       this._id = this.name;
   }
   done();
 });

我正在使用并行中间件并期待更好的性能。此外,在使用上述实现时,您可能需要考虑使用findOneAndUpdatewith upsert = trueforINSERTREPLACE等效实现。

MyModel.findOneAndUpdate(
    {foo: 'bar'}, // find a document with that filter
    modelDoc, // document to insert when nothing was found
    {upsert: true, new: true, runValidators: true}, // options
    function (err, doc) { // callback
        if (err) {
            // handle error
        } else {
            // handle document
        }
    }
);
于 2017-12-09T18:58:13.200 回答