一分钟后,MongoDB NodeJS总是过期

时间:2020-02-17 22:41:59

标签: node.js mongodb timezone momentjs utc

我在节点应用程序中使用MongoDB npm模块,并且我有以下代码使用TTL index在集合中创建新对象:

var utcDate = new Date();
var emailObj = {email: emailAddress, createdAt: utcDate};
dbo.collection("initialEmail").createIndex({ "createdAt": 1 }, { expireAfterSeconds: 3600 });
dbo.collection("initialEmail").insertOne(emailObj, function(err, response) {
    ...
});

但是,条目总是在大约一分钟后删除(而不是我将其设置为1小时)。

我从研究中发现mongo运行其脚本来删除每个one minute。这使我认为由于某种原因,我的mongo服务器时区与节点服务器时区不一致,因此使创建的对象的mongo到期时间早于当前mongo服务器时间一小时。

对于utcDate变量,我尝试过:

  • new Date( moment.utc().format() );
  • new Date( moment().valueOf() );
  • new Date(Date.now() - new Date().getTimezoneOffset() * 60 * 1000);

但是没有效果。所有这些都会使对象在大约1分钟后删除。

我也尝试过:(用于utcDate

  • moment().valueOf();
  • Date.now() - new Date().getTimezoneOffset() * 60 * 1000;

但是,当以JSON形式查看对象时,它们会导致createdAt的类型为int,并且该对象永远不会被删除(即使在预期到期后等待了几分钟)。

如何确保插入的对象将至少持续一个小时?

1 个答案:

答案 0 :(得分:0)

我正在使用带有官方mongo映像的docker-compose。我切换回var utcDate = new Date();,并且可能是由于很早以前我将expireAfterSeconds的值设置为60时,出于某种原因猜测docker映像保存索引的原因。 {3}},“我的价值必须仍然是60。

我删除了图片,然后再次运行docker-compose up,它就可以了。

我根本不使用docker卷,因此我认为mongo映像每次都是全新的构建。我不完全了解Docker映像中数据的半永久性,因此,如果您了解为什么将数据库集合索引属性从一个up保存到另一个[CmdletBinding()] param ( [Parameter(Mandatory=$true)] [string]$dir, [Parameter(Mandatory=$true)] [int]$days, [switch]$csv=$false ) Process { Clear-Host $totSize = 0 $totFiles = 0 $modDate = (Get-date).AddDays(-$days).Date $modfiles = Get-ChildItem -Path $dir -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -ge $modDate } If ($csv = $true){ $modfiles | Select-Object -Property FullName, Length,LastWriteTime | Export-Csv -Path .\modFiles.csv -NoTypeInformation } foreach ($file in $modfiles){ $totFiles = $totFiles + 1 $totSize = $totSize + $file.Length } If ($totSize -lt 1MB){ $outSize = $totSize/1KB $unit = "KB" } elseif (($totSize -ge 1MB) -and ($totSize -lt 1GB)){ $outSize = $totSize/1MB $unit = "MB" } elseif ($totSize -ge 1GB){ $outSize = $totSize/1GB $unit = "GB" } $outRound = [math]::Round($outSize,2) Write-Host $totFiles "Files" Write-Host $outRound $unit } ,请评论并教育我。