Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当数据结构与Mongoose中的模型完全匹配时,如何一次增加多个字段?_Javascript_Mongodb_Mongoose - Fatal编程技术网

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
        }
    }
);