javascript - Toggle 带有单个查询的 Mongo 文档日期属性
问题描述
只知道_id
Mongo 中的文档是否有一种直接的方法来编写一个更新查询来执行以下操作?我认为答案是“不”,但我想知道是否有什么东西可以让这种情况发生。
- 通过
_id
(单个文档)定位文档。 - 如果
readAt
文档中存在该字段,请将其删除 - 如果
readAt
文档中不存在该字段,则将其设置为当前时间
本质上,我想“切换”文档的“读取”状态(使用日期作为标志),而无需实际首先获取文档。
目前我正在使用类似的东西:
collection.update(
{_id: notificationDoc._id},
notificationDoc.readAt
? {$unset: {readAt: true}}
: {$set: {readAt: new Date()}}
)
效果很好,但需要我首先阅读该领域。我并不真正担心比赛条件或其他任何事情,我只是更愿意减少到 DB 的往返行程。
我已经想到了几种方法来通过两个具有不同条件的串行更新查询来做到这一点,但这似乎并不是一种改进。
解决方案
如果您的MongoDB 版本 >= 4.2,那么您可以在更新查询中指定聚合管道。
db.collection.update(
{ _id: notificationDoc._id },
[
{
$set: {
readAt: {
$cond: [
{
$lte: [
"$readAt",
null
]
},
"$$NOW",
"$$REMOVE" //(previously null)
]
}
},
}
])
上面的查询将设置readtAt
为null(如果$$REMOVE
提供,则将其删除) if it exists
和当前日期时间 if not exist/null
推荐阅读
- python - 在函数外部定义的变量不能在函数中使用?
- elasticsearch - 如何在 Elasticsearch 的 date_histogram 选择器中选择最后一个桶
- java - 选择具有知情自然 ID 的实体,而不是尝试插入(JPA 和 SpringBoot)
- sql - 将表复制到另一个有条件并加入
- ubuntu - 删除 terraform snap 包
- input - 直接从 CSV 文件中获取值并作为输入传递
- java - 在 JavaFX 媒体播放器中连续流式传输视频块
- python - 在 lattice machXO3 dev 上使用 ft2232H。木板
- android - 如何使用文件位置链接从 Firebase RealtimeDatabase 下载保存在 FirebaseStorage 中的文件?
- angularjs - AngualrJs:ui-router 视图中的 ag-grid (templateUrl)