Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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 在mongo中创建条件TTL_Mongodb_Mongodb Query_Mongodb Indexes - Fatal编程技术网

Mongodb 在mongo中创建条件TTL

Mongodb 在mongo中创建条件TTL,mongodb,mongodb-query,mongodb-indexes,Mongodb,Mongodb Query,Mongodb Indexes,我想完成一项特别的任务,但我没有找到任何特别的方法来完成。 假设我有一个用来发送邮件的应用程序。我在mongo的一个集合中保存了这些电子邮件的记录。使用这个应用程序,我可以立即发送邮件,也可以为将来安排电子邮件。 集合中文档的结构如下所示: { '_id' : 123456789, 'to_email' : 'xyz@gmail.com' 'from_email' : 'abc@gmail.com' 'subject': 'some subject' 'type' : '<1 if nor

我想完成一项特别的任务,但我没有找到任何特别的方法来完成。 假设我有一个用来发送邮件的应用程序。我在mongo的一个集合中保存了这些电子邮件的记录。使用这个应用程序,我可以立即发送邮件,也可以为将来安排电子邮件。 集合中文档的结构如下所示:

{
'_id' : 123456789,
'to_email' : 'xyz@gmail.com'
'from_email' : 'abc@gmail.com'
'subject': 'some subject'
'type' : '<1 if normal and 2 if scheduled>',
'createdDate' '<date when mail was sent or the request was created>',
'scheduledDate' : '<time for which mail is scheduled>'
.. and many more key-value pairs
}
或者,是否有一种方法可以让我使用任何语言对某些文档进行更改,从而使它们不会过期


编辑:我解决了这个问题,在计划电子邮件的情况下,使用与
scheduledDate
createdDate
相同的值。

您只需在
scheduledDate
上创建一个TTL索引,如果该值为零,它将不会被删除。根据,如果文档中的索引字段不是日期或包含日期值的数组,则文档不会过期

使用Mongo 3.2,我已使用此测试集验证了这一点:

db.data.drop()
db.data.save({scheduledDate: 0})
db.data.save({scheduledDate: new Date()})
db.data.save({scheduledDate: new Date()})
db.data.createIndex( { "scheduledDate": 1 }, { expireAfterSeconds:1} )

使用此集合时,所有
new Date()
条目都将被删除,而第一条值为零值的记录将保留下来

我只需添加另一个字段。没有那么多数据:

{
'_id' : 123456789,
'createdDate' '<date when mail was sent or the request was created>',
'scheduledDate' : '<time for which mail is scheduled>'
'expires': '<Date or NULL>'
}
计划任务的不同过期日期 只需明确设置日期:

myNewDocument.expires = new Date( scheduled + ... );
或更改设置默认值的函数:

function() {
    if(this.get("type") === 2) {
      return scheduled_date_plus_2_days;
    } else {
      return created_date_plus_2_days;
    }
}
完全没有过期 将字段设置为空:

myNewDocument.expires = null;

这样,您就可以为普通邮件、重要邮件、预定邮件等选择不同的到期日。如果您准时,您甚至可以将
expires
字段设置为NULL以取消自动删除。

唯一需要注意的是,如果更改计划时间,则需要更新expires字段。

从MongoDB 3.2开始,还可以使用指定的筛选器表达式添加部分TTL索引。如果您只需要删除正常的非计划电子邮件,您可以使用以下方法:

db.email.createIndex( {createdDate: 1}, {
    expireAfterSeconds: 172800, // 2 days
    partialFilterExpression: {
        scheduledDate: 0
    }
});

请注意,
partialFilterExpression
对可能的筛选条件有限制:

但是如果为“createdDate”设置了另一个TTL索引,那么它也不会过期?您只需要在
scheduledDate
上添加一个TTL索引,这样您就可以仅在成功发送记录后删除记录,否则,看看RikkusRikkus解决方案,您会像这样添加使其过期所需的索引吗
db.emails.createIndex({“expires”:1},{expireAfterSeconds:0})
我觉得正确:在您的情况下,当当前日期是
expires
字段的值时,文档将被删除(给或花一分钟)。请共享scheduledDate的架构类型。我尝试创建类型:Date,默认值:new Date()。所以,若条目为零,那个么它将在5分钟内被删除,若条目有日期,那个么它将不会被删除。但是在插入之后,我会检查它,而不是像这样使用ISO(00:00:00-000z)保存0时间格式。我想初始存储0(数字格式),然后当条件出现时,它将保存当前的ISO日期时间戳。因此,在特定分钟后,只有0 oen将被移除
myNewDocument.expires = null;
db.email.createIndex( {createdDate: 1}, {
    expireAfterSeconds: 172800, // 2 days
    partialFilterExpression: {
        scheduledDate: 0
    }
});
const mongoose = require("mongoose");
const Schema = mongoose.Schema;

let PassWordReSate = new Schema(
  {
    hex: String,
    email: String,
  },
  {
    collection: "PassWordReSate",
    timestamps: true,
  }
);
PassWordReSate.path("createdAt").index({ expires: 6 });
module.exports = mongoose.model("PassWordReSate", PassWordReSate);