Sails.js 如何在sails mongo中使用自动增量

Sails.js 如何在sails mongo中使用自动增量,sails.js,sails-mongo,Sails.js,Sails Mongo,我只是在玩弄sailsjs的概念,然后我才知道如果我们使用mongodb作为数据库,我们就不能在sails中使用自动增量。即使对于非主键属性,我也无法使用自动增量。对于不是主键的属性,是否有任何特殊方法可以使用自动递增操作?提前感谢如果waterline没有自动支持它(看起来是这样的),您可以在创建waterline之前的中执行。它独立于任何数据库适配器 我建议您了解一下生命周期回调是如何工作的,以获得清晰的理解。工作流将类似于以下内容。在创建任何记录之前,您需要检查模型的记录计数。然后更新要创

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

如果waterline没有自动支持它(看起来是这样的),您可以在创建waterline之前的
中执行。它独立于任何数据库适配器

我建议您了解一下生命周期回调是如何工作的,以获得清晰的理解。工作流将类似于以下内容。在创建任何记录之前,您需要检查
模型的记录计数。然后更新要创建的记录的
x
字段,使其比找到的计数多出一个,并传递batton

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

清点记录不是一个完美的方法。您可以更改查找自动递增值的方式。本例的目的是让您直观地了解如何做到这一点。这不是自动增量的确切替代方案,但我想这是一种有效的解决方法。希望对你有帮助

有不同的策略,如何使用mongo创建自动递增序列。您可以在官方文档中找到一般信息

这里是对sails.js waterline的第一种方法的改编,它使用计数器集合。首先,您必须创建一个序列模型并实现一个get-next方法

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);
                });

        });

    },
};
因为waterline不支持mongodb的findAndModify功能,所以必须使用本机驱动程序方法。它看起来有点奇怪,但它能工作。更多关于它

然后,您可以在模型的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 ...
};

我知道有点晚了,但我只是为自己解决了这个问题,并想与大家分享。

对于任何对使用Native in-Sails实现感兴趣的人,这里是一个工作示例。此示例假定您有一个计数器集合:

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={
属性:{
num:{type:'number'}
},
下一个(id,cb){
var db=Sequence.getDatastore().manager
var collection=db.collection('num')
collection.findAndModify(
{{u id:id},
[u id',asc']],
{$inc:{num:1}},
{new:true,upsert:true},
(err,data)=>cb(err,data.value.num)
)
}
}
//api/models/Order.js
module.exports={
属性:{
编号:{type:'number'},
},
创建前(obj、cb){
Sequence.next('order',(err,num)=>{
如果(错误)返回cb(错误)
obj.number=num
cb()
})
}
}

冷静的解决方式!奇怪的事情,但它的工作和解决问题很容易!谢谢
Model
var在哪里?虽然beforeCreate建议是合理的,但使用count()方法是不合理的,因为(a)obj['x']的值可能与计数不一致,(b)如果记录被删除,这些值将被丢弃,所有记录都需要更新才能准确。更好的方法:执行find()并根据整数列对结果进行排序,选择第一个结果,然后递增该结果!在mongodb中使用auto increment的唯一安全方法是在计数器集合中存储其他集合的auto increment索引。
Sequence
var在哪里?这段代码会去哪里?在修改数据库的钩子中?我将此代码放在服务的函数中。然后,您可以从任何需要的地方访问该服务