Javascript 当数据结构与Mongoose中的模型完全匹配时,如何一次增加多个字段?
我目前有一个包含许多字段的模式,所有字段的类型如下:Javascript 当数据结构与Mongoose中的模型完全匹配时,如何一次增加多个字段?,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,我目前有一个包含许多字段的模式,所有字段的类型如下: const mySchema = new mongoose.Schema({ fields: { field1: { type: Number, default: 0 }, field2: { type: Number, default: 0 }, ...
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
}
}
);
这就产生了错误,这是可以理解的
“无法使用非数字参数递增:…”
mongodb不支持您尝试执行的操作 参考: 但是,可以编写生成这些映射的助手函数
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)
最后,如果可以更改模式,还可以使helper函数更通用,以指定“root”键或支持深度路径安全搜索。 试试这个: 01)像文档示例一样更改架构:
{
"fields" : [
{
"name" : "field1",
"value" : 1
},
{
"name" : "field2",
"value" : 2
},
{
"name" : "field3",
"value" : 3
}
]
}
02)MongoDB中的更新命令(仅供参考):
03)可能的实施:
MyModel.findOneAndUpdate(
{...},
{
$inc: {
"fields.$[].value": 1
}
}
);
由于$inc有一个键名和另一个数字值,因此谁想要这样做?是否有可能更改集合的架构?我可以更改架构,但您有什么建议?这会使所有字段增加相同的值吗?
MyModel.findOneAndUpdate(
{...},
{
$inc: {
"fields.$[].value": 1
}
}
);