【问题标题】:Mongoose auto increment by not replacing ID fieldMongoose 通过不替换 ID 字段自动递增
【发布时间】:2019-03-23 23:49:01
【问题描述】:

那里有许多 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 开始的

【问题讨论】:

  • 有什么问题?
  • autoIncrement: true 是一个有效的声明吗?我在最后用一个更直接的问题更新了我的问题。

标签: mongodb mongoose


【解决方案1】:

MongoDB 不支持开箱即用的此类选项。但是,您可以通过编程方式实现此目的。

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

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

这将导致新集合从没有文档开始,然后在您的第一次 findOneAndUpdate() 调用之后只有一个文档开始,并且只会重复更新其 counter 字段。

【讨论】:

    【解决方案2】:

    你可以尝试hook在loopback中实现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();
    }); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 2017-09-09
      相关资源
      最近更新 更多