【发布时间】:2019-01-09 22:18:03
【问题描述】:
我有一个依赖的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
},
...
...
我的问题是,如果相关字段为空,我如何才能不在查询中包含相关字段,而无需针对每个场景进行多个查询。
谢谢。
【问题讨论】:
标签: javascript mongodb upsert