如何在sails中使用自增-mongo

How to use auto increment in sails-mongo

我只是在玩弄 sailsjs 的概念,然后我开始知道如果我们使用 mongodb 作为我们的数据库,我们不能在 sails 中使用自动增量。即使对于非主键属性,我也无法使用自动增量。是否有任何特殊方法可以对非主键的属性使用自动递增操作?提前致谢

如果 waterline 不自动支持,看起来是这样,你可以在 waterline 的 beforeCreate lifecycle callback 中进行。它独立于任何数据库适配器。

我建议您看一下生命周期回调的工作原理,以便清楚地理解。工作流程如下所示。在创建任何记录之前,您将检查 Model 的记录数。然后将要创建的记录的x字段更新为比找到的计数多1并传递接力棒。

beforeCreate: function(obj, next){
    Model.count().exec(function(err, cnt){
        if(err) next(err);
        else{
            obj['x'] = cnt + 1;
            next(null);
        }
    })
}

统计记录并不是完美的方法。您可以更改您喜欢的查找自动增量值的方式。此示例的目的是让您直观地了解如何完成此操作。这不是自动增量的确切替代方案,但我猜它是一种有效的解决方法。希望对你有帮助。

有不同的策略,如何使用 mongo 创建自动递增序列。您可以在官方文档中找到一般信息http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

这里是 sails.js waterline 的第一种方法的改编版,它使用计数器收集。首先,您必须创建一个序列模型并实现一个获取下一个方法。

module.exports = {
    attributes : {
        num : {
            type : "integer"
        },
    },

    next : function (id, cb) {

        Sequence.native(function (err, col) {

            col.findAndModify(
                { _id: id },
                [['_id', 'asc']],
                {$inc: { num : 1 }},
                { new: true, upsert : true}
                , function(err, data) {

                    cb(err, data.value.num);
                });

        });

    },
};

由于水线不支持 mongodb 的 findAndModify 功能,您必须使用本机驱动程序方法。它看起来有点奇怪,但它确实有效。更多信息 here

然后您可以在模型的 beforeCreate 生命周期回调方法中调用 Sequence.next() 来获取新集合文档的下一个自动增量值。

// Model Order, for Example.
module.exports = {

    attributes: {

        number: {
            type: "integer"
        },
        // other attributes
    },

    // add auto increment value for "number" before create a document
    beforeCreate : function (values, cb) {

        // add seq number, use
        Sequence.next("order", function(err, num) {

            if (err) return cb(err);

            values.number = num;

            cb();
        });
    }

    // your other methods ...
};

我知道有点晚了,但我刚帮我解决了,想分享一下。

对于任何对在 Sails 中使用 Native 实现感兴趣的人,这里是一个工作示例。该示例假定您有一个 Counters 集合:

Counters.native(function(err, collection) {

        collection.findAndModify(
          {"_id": "order_id"}, // query
          [['_id','asc']],  // sort order
          { "$inc": { "seq": 1 }}, // increments the seq
          {"new": true}, // options
          function(err, object) {
              if (err){
                  sails.log.debug("ERROR",err.message);  // returns error if no matching object found
              }else{
                  sails.log.debug(object);
              }
          });
        });

这是一个适用于 Sails v1 的解决方案

// api/models/Sequence.js

module.exports = {
  attributes: {
    num: { type: 'number' }
  },
  next (id, cb) {
    var db = Sequence.getDatastore().manager
    var collection = db.collection('num')

    collection.findAndModify(
      { _id: id },
      [[ '_id', 'asc' ]],
      { $inc: { num : 1 }},
      { new: true, upsert : true },
      (err, data) => cb(err, data.value.num)
    )
  }
}
// api/models/Order.js

module.exports = {
  attributes: {
    number: { type: 'number' },
  },
  beforeCreate (obj, cb) {
    Sequence.next('order', (err, num) => {
      if (err) return cb(err)
      obj.number = num
      cb()
    })
  }
}