gpt4 book ai didi

node.js - NodeJS + Mongoose : Updating all fields on a Mongoose model

转载 作者:IT老高 更新时间:2023-10-28 13:10:54 24 4
gpt4 key购买 nike

我正在使用 Node、MongoDB 和 Mongoose 构建一个 api。困扰我的一件事是您似乎无法一次设置多个字段:

app.put('/record/:id', function(req, res) {
Record.findById(req.params.id, function(err, doc) {
if (!err) {
doc.update(req.params);
doc.save();
...

但是,您似乎必须制定更新查询并在模型对象而不是文档对象上运行它。除非您想分配单个属性并在最后运行 save()。

有什么方法可以在不编写 Mongo 查询的情况下完成此任务?

最佳答案

jsaak 的回答很好,但不适用于嵌套对象。我通过搜索和设置嵌套对象详细阐述了他的答案。

我将这些函数添加到了一个 utility.js 文件中

var _ = require('underscore');

exports.updateDocument = function(doc, SchemaTarget, data) {
for (var field in SchemaTarget.schema.paths) {
if ((field !== '_id') && (field !== '__v')) {
var newValue = getObjValue(field, data);
console.log('data[' + field + '] = ' + newValue);
if (newValue !== undefined) {
setObjValue(field, doc, newValue);
}
}
}
return doc;
};

function getObjValue(field, data) {
return _.reduce(field.split("."), function(obj, f) {
if(obj) return obj[f];
}, data);
}

function setObjValue(field, data, value) {
var fieldArr = field.split('.');
return _.reduce(fieldArr, function(o, f, i) {
if(i == fieldArr.length-1) {
o[f] = value;
} else {
if(!o[f]) o[f] = {};
}
return o[f];
}, data);
}

实现为:

var util = require('./utility');

app.put('/record/:id', function(req, res) {
Record.findById(req.params.id, function(err, doc) {
if (!err) {
utils.updateDocument(doc, Record, req.params);
doc.save();
...

关于node.js - NodeJS + Mongoose : Updating all fields on a Mongoose model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9369794/

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