首页 > 解决方案 > Toggle 带有单个查询的 Mongo 文档日期属性

问题描述

只知道_idMongo 中的文档是否有一种直接的方法来编写一个更新查询来执行以下操作?我认为答案是“不”,但我想知道是否有什么东西可以让这种情况发生。

  1. 通过_id(单个文档)定位文档。
  2. 如果readAt文档中存在该字段,请将其删除
  3. 如果readAt文档中不存在该字段,则将其设置为当前时间

本质上,我想“切换”文档的“读取”状态(使用日期作为标志),而无需实际首先获取文档。

目前我正在使用类似的东西:

collection.update(
  {_id: notificationDoc._id},
  notificationDoc.readAt
    ? {$unset: {readAt: true}}
    : {$set: {readAt: new Date()}}
)

效果很好,但需要我首先阅读该领域。我并不真正担心比赛条件或其他任何事情,我只是更愿意减少到 DB 的往返行程。


我已经想到了几种方法来通过两个具有不同条件的串行更新查询来做到这一点,但这似乎并不是一种改进。

标签: javascriptnode.jsmongodb

解决方案


如果您的MongoDB 版本 >= 4.2,那么您可以在更新查询中指定聚合管道。

db.collection.update(
{ _id: notificationDoc._id },
[
  {
    $set: {
      readAt: {
        $cond: [
          {
            $lte: [
              "$readAt",
              null
            ]
          },
          "$$NOW",
          "$$REMOVE" //(previously null)
        ]
      }
    },
    
  }
])

上面的查询将设置readtAtnull(如果$$REMOVE提供,则将其删除) if it exists当前日期时间 if not exist/null

你可以看到比较是如何工作的


推荐阅读