kad*_*amb 6 mongodb mongodb-query mongodb-indexes
我想完成一项特殊的任务,但我没有找到任何特定的方法来做到这一点.假设我有一个用于发送邮件的应用程序.我在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
}
Run Code Online (Sandbox Code Playgroud)
scheduledDate字段可以是零或任何日期,具体取决于是否已计划.我不想保留超过2天的数据,所以我在'createdDate'上创建了一个TTL索引,为期2天.但我也不想删除将来安排的行或请求.我正在寻找某种条件TTL,但无法找到任何这样的解决方案.
是否有任何可用的条件TTL或任何其他方式在mongodb中做到这一点.
我想创建一个TTL,其工作方式如下:
if(requestType!=2 and createdDate < -2days)
delete row;
Run Code Online (Sandbox Code Playgroud)
或者有没有办法可以使用任何语言对某些文档进行更改,以便它们不会过期.
编辑:我通过在预定邮件的情况下使用scheduledDate和requestDate的相同值解决了这个问题.
Rik*_*kus 10
我只想添加另一个字段.这不是那么多数据:
{
'_id' : 123456789,
'createdDate' '<date when mail was sent or the request was created>',
'scheduledDate' : '<time for which mail is scheduled>'
'expires': '<Date or NULL>'
}
Run Code Online (Sandbox Code Playgroud)
向expires字段添加0秒的TTL索引.不要在其他日期添加TTL.
以下示例在Mongoose(节点的ORM)中,但这些想法应该延续到您正在使用的任何框架:
您可以将默认值添加到expires字段,其值为"created date + 2 days".
{
type: Date,
default: function() {
return new Date(Date.now() + 1000*60*60*24*2);
}
}
Run Code Online (Sandbox Code Playgroud)
只需明确设置日期:
myNewDocument.expires = new Date( scheduled + ... );
Run Code Online (Sandbox Code Playgroud)
或者更改设置默认值的函数:
function() {
if(this.get("type") === 2) {
return scheduled_date_plus_2_days;
} else {
return created_date_plus_2_days;
}
}
Run Code Online (Sandbox Code Playgroud)
将字段设置为NULL:
myNewDocument.expires = null;
Run Code Online (Sandbox Code Playgroud)
这样,您就可以为普通电子邮件,重要电子邮件,预定电子邮件等选择不同的到期日期.如果您准时,您甚至可以将该expires字段设置为NULL以取消自动删除.
唯一需要注意的是,如果您更改预定时间,则需要更新过期字段.
小智 9
从MongoDB 3.2开始,还可以使用指定的过滤器表达式添加部分TTL索引.如果您只需要删除正常未安排的电子邮件,则可以使用以下内容:
db.email.createIndex( {createdDate: 1}, {
expireAfterSeconds: 172800, // 2 days
partialFilterExpression: {
scheduledDate: 0
}
});
Run Code Online (Sandbox Code Playgroud)
请注意,partialFilterExpression对可能的过滤条件有限制:https://docs.mongodb.com/manual/core/index-partial/
| 归档时间: |
|
| 查看次数: |
8681 次 |
| 最近记录: |