gpt4 book ai didi

javascript - 当数据结构与 Mongoose 中的模型完全匹配时,如何一次增加多个字段?

转载 作者:行者123 更新时间:2023-11-30 13:49:26 25 4
gpt4 key购买 nike

我目前有一个包含许多字段的模式,所有字段的类型都是这样的:

const mySchema = new mongoose.Schema({
fields: {
field1: {
type: Number,
default: 0
},
field2: {
type: Number,
default: 0
},
...
field20: {
type: Number,
default: 0
}
}
});

const MyModel = mongoose.model('model', mySchema);
module.exports = MyModel;

我目前单独递增所有字段:

const fields = {
field1: 5,
field2: 10,
...
field20: 7
};

MyModel.findOneAndUpdate(
{...},
{
$inc: {
"fields.field1": fields.field1,
"fields.field2": fields.field2,
...
"fields.field20": fields.field20
}
}
);

是否有一种速记方式可以一次递增所有这些字段?如下所示:

MyModel.findOneAndUpdate(
{...},
{
$inc: {
"fields": fields
}
}
);

这可以理解地给出了错误

"Cannot increment with non-numeric argument: ..."

最佳答案

mongodb 不支持您尝试执行的操作引用:https://docs.mongodb.com/manual/reference/operator/update/inc/

但是,可以编写生成这些映射的辅助函数。

function generateIncrement(fields){
return Object.keys(fields).reduce((mappings, key) => {
mappings[`fields.${key}`] = fields[key]
return mappings
},{})
}

这会给

const fields = {
field1: 5,
field2: 10,
...
field20: 7
};

MyModel.findOneAndUpdate(
{...},
{
$inc: generateIncrement(fields)
}
);

它也可以在模型中被隔离

模型是

const mySchema = new mongoose.Schema({
fields: {
field1: {
type: Number,
default: 0
},
field2: {
type: Number,
default: 0
},
...
field20: {
type: Number,
default: 0
}
}
});
MyModel.static({
incrementAllFields: async function incrementAllFields(query, fields) {
return this.findOneAndUpdate(
query,
{
$inc: generateIncrement(fields)
}
);
}
})
const MyModel = mongoose.model('model', mySchema);
module.exports = MyModel;

用法会变成

const fields = {
field1: 5,
field2: 10,
...
field20: 7
};

MyModel.incrementAllFields({...}, fields)

最后,还可以使辅助函数更通用以指定“根”键或支持深度路径安全搜索

关于javascript - 当数据结构与 Mongoose 中的模型完全匹配时,如何一次增加多个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58574117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com