javascript - Mongodb:如果传递的值为空,如何更新 $min 和 $max
问题描述
我有一个upsert
依赖的查询和一个data
包含值的对象。现在,可能会发生某些字段,例如data.sumPacketSize.value
可能null
- 在这种情况下,mongo 会抛出一个错误,指出$min
/$max
需要一个数字值。
我原来的查询是:
profiler.upsert({
name: target,
}, {
$inc: {
flowCount: data.doc_count
},
$inc: {
sumPacketSize: data.sumPacketSize.value
},
$inc: {
sumFlowSize: data.sumFlowSize.value
},
$max: {
maxPacketSize: data.maxPacketSize.value,
maxFlowSize: data.maxFlowSize.value
},
$min: {
minPacketSize: data.minPacketSize.value,
minFlowSize: data.minFlowSize.value
},
});
解决这个问题的一种方法是确定数据对象的哪些键中有null
值,并根据它形成一个特定的 mongo 查询。然而,它并不优雅,更像是一种粗略的方法。
另一种方法是首先在数据库中查询现有值。如果传递的当前值为 null,则取而代之的是现有值:
...
...
let existingProfiler = profiler.findOne({name: target});
data.maxPacketSize.value === null && existingProfiler && (data.maxPacketSize.value = existingProfiler.maxPacketSize);
data.minFlowSize.value === null && existingProfiler && (data.minFlowSize.value = existingProfiler.minFlowSize);
... no change with the mongo query...
$max: {
maxPacketSize: data.maxPacketSize.value,
maxFlowSize: data.maxFlowSize.value
},
...
...
我的问题是,如果相关字段为空,我如何不在查询中包含相关字段,而无需针对每个场景进行多个查询。
谢谢。
解决方案
作为$max
并将$min
当前值与指定值进行比较,一种解决方案是使用一个虚拟值,这将强制 mongo 使用当前值,即
profiler.upsert({
name: target,
}, {
$inc: {
flowCount: data.doc_count
},
$inc: {
sumPacketSize: data.sumPacketSize.value
},
$inc: {
sumFlowSize: data.sumFlowSize.value
},
$max: {
maxPacketSize: data.maxPacketSize.value || SOME_LOWER_BOUND,
maxFlowSize: data.maxFlowSize.value || SOME_LOWER_BOUND
},
$min: {
minPacketSize: data.minPacketSize.value || SOME_UPPER_BOUND,
minFlowSize: data.minFlowSize.value || SOME_UPPER_BOUND
},
});
推荐阅读
- powershell - 将 Powershell 脚本转换为 jenkins 作业
- javascript - FabricJS 裁剪扩展功能
- vue.js - vue-google-charts 不在 index.vue 上显示图表,但在其他所有地方
- ios - SwiftUI 在 macOS 和 iOS 的 Form 中将“评级”视图对齐在两个单独的行中
- php - 如何在 graphql-laravel 中使用 UnionType?
- javascript - 如何使用 Web Speech API 以一种可以听到 textarea 行的单词的方式,每行都以延迟的方式?
- c# - 为什么我的 ASP.NET Web 表单呈现缓慢?
- javascript - 人脸对比API
- javascript - 如何使分页位于选项卡内的页面底部?
- python - Discord.py - 使用计时器静音消息