node.js - Node Mongoose 更新两个集合

标签 node.js mongodb mongoose

我有两个架构,一个“项目”架构和一个“应用程序”架构。

在集合中创建新条目并根据新条目中的数据更新另一个集合中的现有条目的最有效方法是什么?当应用程序集合发生更改时,我可以避免发出多个 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),您可以在应用程序模型上使用它来更新项目并增加应用程序数量。

编辑 - 添加伪代码

  1. 项目模型
// 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/

    相关文章:

    node.js - 来自多个进程的 Mongodb 查询;如何实现原子性?

    node.js - 如何使用 Azure api 启动容器实例?

    node.js - 由于模型错误,无法执行 Typescript、NodeJS 和 Sequelize

    mongodb - EC2 中的 MongoDB 的 EBS 还是实例存储?

    javascript - 无法访问对象键值对

    javascript - Expressjs : Search query api

    javascript - 使用 async/await 时 try/catch 中的范围问题

    sql-server - 如何让sequelize在其SQL语句中的Unicode字符串前加N?

    javascript - 使用单个 frisby.js 测试文件创建多个 cookie

    javascript - 如何在 Meteor javascript 中使用 Mongodb 填充下拉菜单?