Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 模型中的Sails.js expireAfterSeconds选项_Mongodb_Model_Sails.js_Database - Fatal编程技术网

Mongodb 模型中的Sails.js expireAfterSeconds选项

Mongodb 模型中的Sails.js expireAfterSeconds选项,mongodb,model,sails.js,database,Mongodb,Model,Sails.js,Database,我正在使用sails编写一个简单的模型,它将在几个小时后过期,所以我需要类似的东西 createdAt: { type: 'Date', expires : 60, index: true } 但是当我检查数据库(MongoDB)时,“expireAfterSeconds”似乎不起作用,因此我必须使用 db.collection.ensureIndex( { "createdAt": 1 }, { expireAfterSecon

我正在使用sails编写一个简单的模型,它将在几个小时后过期,所以我需要类似的东西

    createdAt: {
        type: 'Date',
        expires : 60,
        index: true
    }
但是当我检查数据库(MongoDB)时,“expireAfterSeconds”似乎不起作用,因此我必须使用

db.collection.ensureIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )

我想知道是否可以在模型中设置“expire”选项?

检查负责处理
索引
属性属性[1]的sails mongo源代码,它似乎没有考虑类似
expires
属性的任何内容。不过,这是有道理的,因为sails.js水线ORM不支持数据库特定功能,如在MongoDB中过期索引数据

但是,waterline确实通过
Collection.native()
方法[2]提供对MongoDB本机连接(使用)的访问

很有可能,在Sails应用程序的生命周期中,您只需要对模型的索引进行一次更改,因此最好在
config/bootstrap.js
文件中进行更改。在sails.js生命周期的这一点上,所有模型都已实例化,因此您可以执行类似的操作来对密钥执行必要的逻辑:

// config/bootstrap.js
exports.bootstrap = function (done) {

    YourModelName.native(function (err, collection) {
        // define index properties
        collection.ensureIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } );

        // be sure to call the bootstrap callback to indicate completion
        done();
    });
}
您可以更进一步,编写一个实用程序来检查sails加载的模型(它们在全局对象
sails.models
中作为键提供),如果它们具有
expires
属性,则执行必要的本机功能。这也需要在
config/bootstrap.js
中完成

如果您有本机功能需要按记录执行,那么可以使用sails.js模型生命周期挂钩[3]来实现

参考资料:

  • [1]
  • [2]
  • [3] 请参阅标题为“生命周期回调”的部分@
更新: 我创建了一个sails钩子,为使用sails-mongo适配器的模型提供高级索引选项

支持所有mongo索引选项


旧的:

如果model属性具有expires属性且类型为“date”,我创建了下面的命令来自动执行此操作。只需粘贴到config/bootstrap.js中即可

希望有帮助

\u0.forEach(对象.键(帆.模型),函数(键){
var模型=sails.models[key];
_.forEach(对象.键(模型.属性),函数(属性){
if(model.attributes[attr].hasOwnProperty('expires')){
var seconds=model.attributes[attr].expires;
//从全局模型中删除验证器,否则sails将出错
删除sails.models[key].attributes[attr].expires;
删除sails.models[key]。_validator.validations[attr]。过期;
if(model.attributes[attr].hasOwnProperty('type')&&model.attributes[attr].type=='date')){
var obj={};
obj[attr]=1;
model.native(函数(err,collection){
//定义索引属性
集合。确保索引(obj{
expireAfterSeconds:秒
},函数(err){
如果(错误)
sails.log.error(err);
其他的
sails.log.info(key+“model attribute'”+attr+“”已设置为在“+seconds+”秒之后使文档过期);
});
});
}否则{
sails.log.warn(key+“model attribute”“+attr+””设置为过期,但不是“date”类型。正在跳过…);
}
}
});

});谢谢!非常好的解决方案!只需一条注释:需要一个回调函数来执行
ensureIndex
操作,否则会出现错误“如果没有提供的回调,则无法使用writeConcern”@Chuan:ah好的。如果您想阻止引导继续进行,直到索引得到保证,那么在传递给ensureIndex的回调中调用done()是很重要的。在我的例子中,保存是为了让引导继续,所以我只是将done()放在外部。但你是对的,在某些情况下,防止它继续下去是很重要的,这一点很好!