【问题标题】:Mongodb: How to update $min and $max if value passed is nullMongodb:如果传递的值为空,如何更新 $min 和 $max
【发布时间】: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


    【解决方案1】:

    由于$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
        },
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 2012-08-26
      • 2014-03-31
      • 2021-09-11
      • 2016-05-11
      相关资源
      最近更新 更多