如何在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()
})
}
}
我只是在玩弄 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()
})
}
}