通过不替换ID字段来自动增加猫鼬

时间:2018-10-19 05:34:11

标签: mongodb mongoose

有很多Mongoose自动增量堆栈溢出问题和答案,但是所有人都想用一个递增的数字代替Mongoose ID。我不想替换ID,我只想要一个名为index的额外字段,它将容纳一个递增的数字。我知道这可能没有道理,但这是我所需要的。有这样的东西吗?

const productSchema = mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    index: {
        type: Number,
        autoIncrement: true // something like this?
    }
});

因此,我希望index字段自动递增(1, 2, 3, 4, 5...)。我真的不在乎是以0还是1

开头的

2 个答案:

答案 0 :(得分:0)

MongoDB暂时不支持此类选项。但是,您可以通过编程来实现。

您要做的是创建一个单独的集合。使用此新集合,您可以执行findOneAndUpdate()调用,并使用选项$inc在文档的counter字段(或您的首选替代方法)上执行upsert: true修订操作。应用。通过设置选项new: true,您还将获得文档的更新版本,而不是原始版本。

findOneAndUpdate()调用完成后,您将收到一个包含从1开始的连续整数值的文档。然后,您可以从counter字段中获取该值并将其存储在您要保存的文档中最初想要此值。如果您希望该值从0开始,只需插入偏移量-1

这将导致新集合中没有任何文档,然后在您的第一次findOneAndUpdate()调用之后恰好有一个文档开始,而该文档只会重复更新其counter字段。

答案 1 :(得分:0)

您可以尝试在环回中实现autoIncrement。

  

示例:increment保存后的某些字段。可能会帮助您

Model.observe('after save', function (ctx, next) {

  const ModelCollection = Model.getDataSource().connector.collection("Model");
  let id = ctx.instance.id; //get id which are save.
  ModelCollection.update(id, {
    $inc: {
      index: 1
    }
  }, {
      multi: true
    });
  next();
});