【问题标题】:Update mongo document based on time根据时间更新 mongodb 文档
【发布时间】:2017-08-18 22:00:16
【问题描述】:

假设我正在制作一个游戏大厅,并且我想要一个包含打开/关闭状态(布尔值)的“房间”文档。我想在我的数据库中存储这个大厅开放注册,直到比赛前 24 小时。比赛前24小时,我会将数据库中的房间文档标记为关闭注册,不会在搜索等中显示给用户。

如何在比赛前 24 小时更新 mongo 中的字段?我还希望解决方案能够处理服务器重启。我正在通过 node.js 和 mongoose 连接到 mongodb。

我在 aws ebs 上运行应用程序,而 db 将在另一个服务上。

【问题讨论】:

  • 现在只检查注册时间是不是提前24小时,不允许注册
  • @georoot 我不确定像这样的解决方案对性能的影响,我不仅使用阻止注册的值,而且还在查询中过滤掉未打开的值。拥有状态不是比总是检查更好的解决方案吗?
  • 没有,但是如果你想获得更好的性能,你可以使用内存缓存来防止调用数据库检查关闭日期

标签: node.js mongodb mongoose scheduled-tasks


【解决方案1】:

上面回答的一个困难是您写的需要:“我还希望解决方案能够处理服务器重启。” 到目前为止,您可以使用缓存处理状态,而不必一直处理从集合中读取。另外我不清楚您是根据字段参数关闭整个集合,还是关闭字段?从您提供的信息中看不清楚。

但是,如果您在服务器上正确安装了 Mongo 作为服务,那么当服务器重新启动时,Mongo 将重新启动。 (也没有提到你在什么类型的服务器上。)

可能性#1: NPM 缓存将在服务器重新启动时消失,因此您不能依赖它。您需要做的是创建一个字段或 sep.集合,简单地说,您将在 24 小时前更新一次。您必须运行一个函数(cron 作业?)来关闭注册并将一个字段放在一个集合中,该集合将设置为布尔值(只是一个建议),如下所示:

{“allowsignups”:真/假可能性}

我不使用 Mongoose,但它会在架构中处理上述内容。 Native 也将得到正确处理。

除非您使用的是 Redis,否则由于服务器重新启动而保存它的缓存将无济于事。

可能性 #2: 在磁盘上保留一个简单的 JSON 文件,其中包含允许或不允许注册的参数。有一个检查某人开机时间的例程,如果 JSON 文件将allowedsignups 设置为false,则不允许或显示它。这是 Node 中的一个简单的fs,也可以在服务器重启后继续存在。它不涉及对数据库的任何读/写操作,也不会使您的数据库架构复杂化。您可以将 JSON 文件用于多个游戏和更多参数。

你的选择。

希望这会有所帮助。

【讨论】:

  • 嘿,我只想翻转一个布尔值,它会在游戏时间 24 小时后跟踪它是否在房间文档中打开注册。我在 aws 的弹性 beantalk 上运行我的节点 js 应用程序。 mongo db 将托管在另一个服务上。我也在考虑一种文件方法,并在服务器启动并更新值时将其加载到内存缓存中。感谢您非常详细的回复。
猜你喜欢
  • 2013-06-22
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多