首页 > 解决方案 > 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               
},
...
...

我的问题是,如果相关字段为空,我如何不在查询中包含相关字段,而无需针对每个场景进行多个查询。

谢谢。

标签: javascriptmongodbupsert

解决方案


作为$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
    },
});

推荐阅读