MongoDB - 如果为空则设置查询运算符

4
我想知道是否存在一个$setIfNullOrEmpty运算符。我目前使用的是这样一个upsert操作:
const filter = {
    id: 123
}
const updates = {
    $set: {
        varx: valx
    },
    $inc: { vary: valy },
    $setOnInsert: z
};
const options = { upsert: true };
collection.updateOneWithOptions(filter, updates, options);

我希望还可以选择在数据库中的值为null或者空字符串时设置一些值,我的理想更新对象如下(是否有类似于此的功能?):

$set:设置一个值。
const updates = {
        $set: {
            varx: valx
        },
        $setIfNullOrEmpty: {
            varxy: varxy
        }
        $inc: { vary: valy },
        $setOnInsert: z
    };

我知道可以通过2次查询(一次查询目标项目,检查该属性,另一次更新项目)来实现,但我正在寻找一种只需进行1次查询的方法。是否有此类方法?

2个回答

3
这可以通过使用$cond运算符来实现。
尝试下面的命令。
const filter = {
    id: 123
}
const updates = {
    $cond: {
        if: {
            $or:[{$eq: ["varxy",null]},{$eq: ["varxy",""]}]
        },
        then: {
            $set: {
                varxy: varxy
            }
        },
        else: {
            $set: {
                varx: valx
            }
        }
    },
    $inc: { vary: valy },
    $setOnInsert: z
};
const options = { upsert: true };
collection.updateOneWithOptions(filter, updates, options);

0
根据文档所述:

$inc 操作符将字段按指定值递增。

如果该字段不存在,则 $inc 创建该字段并将其设置为指定值。

因此,您当前的查询有效。如果找到的文档没有字段vary,它将被创建并设置为您指定的值。

2
谢谢您的回答,不幸的是我认为那并没有回答我的问题。我正在寻找一个$set,它可以在字段为空或空字符串时工作。$inc仅适用于整数,并且仅在该字段不存在时设置该字段。如果该字段为null或空字符串,则不会设置。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接