我有两个架构,一个“项目”架构和一个“应用程序”架构。
在集合中创建新条目并根据新条目中的数据更新另一个集合中的现有条目的最有效方法是什么?当应用程序集合发生更改时,我可以避免发出多个 API 请求并以某种方式在 mongoDB 端运行“存储过程”来处理更新项目集合吗?
在这种情况下,理想情况下,当创建项目的应用程序时,会在应用程序集合中创建一个新条目,并且更新项目集合中的项目以反射(reflect)应用程序中的信息。
我可以在不发出多个 api 请求的情况下执行此操作吗?
项目架构:
// models product.js
const mongoose = require('mongoose');
const { ObjectId } = mongoose.Schema;
const projectSchema = new mongoose.Schema({
name: {
type: String,
trim: true,
required: true,
maxlength: 32
},
applications: {
type: Number,
default: 0
},
created_by: {
type: ObjectId,
ref: 'User'
},
applicants: {
type: Array,
default: []
}
}, {timestamps: true}
);
module.exports = mongoose.model("Project", projectSchema);
应用程序架构:
const mongoose = require('mongoose');
const applicationSchema = new mongoose.Schema({
applicantId: {
type: ObjectId,
ref: 'User'
},
ownerId: {
type: ObjectId,
ref: 'User'
},
projectId: {
type: ObjectId,
ref: 'Project'
}
}, {timestamps: true});
module.exports = mongoose.model("Application", applicationSchema);
请注意,这些是单独的架构,因为它们每个都包含大约 15 个字段,我已将它们修剪下来以发布此问题。
最佳答案
我建议对 Mongoose 模型使用钩子(Hook),有一个保存后钩子(Hook),您可以在应用程序模型上使用它来更新项目并增加应用程序数量。
编辑 - 添加伪代码
- 项目模型
// models -> project.js
const mongoose = require('mongoose');
const {
ObjectId
} = mongoose.Schema;
const projectSchema = new mongoose.Schema({
name: {
type: String,
trim: true,
required: true,
maxlength: 32
},
applications: {
type: Number,
default: 0
},
created_by: {
type: ObjectId,
ref: 'User'
},
applicants: {
type: Array,
default: []
}
}, {
timestamps: true
});
projectSchema.statics = {
/**
* Find project by _id
*
* @param {ObjectId} _id
* @api private
*/
get: function (_id) {
return this.findOne({
_id
})
.exec();
}
}
module.exports = mongoose.model("Project", projectSchema);
- 应用模型
const mongoose = require('mongoose');
const projectModel = require("./project")
const applicationSchema = new mongoose.Schema({
applicantId: {
type: ObjectId,
ref: 'User'
},
ownerId: {
type: ObjectId,
ref: 'User'
},
projectId: {
type: ObjectId,
ref: 'Project'
}
}, {
timestamps: true
});
// Async hook
applicationSchema.post('save', function (doc, next) {
const relatedProject = projectModel.get(doc.projectId);
relatedProject.applications++;
relatedProject.save();
next();
});
module.exports = mongoose.model("Application", applicationSchema);
关于node.js - Node Mongoose 更新两个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58011900/