【问题标题】:mongodb & mongoose: How to auto create new collection when saving a document in itmongodb 和 mongoose:如何在其中保存文档时自动创建新集合
【发布时间】:2022-01-07 22:42:37
【问题描述】:

程序说明:我有一个程序,它接受一个带有namedescriptionimportancegroup 参数的“hometask”的发布请求 (request)假如。我需要将提供的组参数标识为数据库中的集合名称(每个集合将对应于特定的组,因此每个组都将有一个 hometasks-documents 的集合)。每个新文档都应该使用 Mongoose 模式对象创建。

问题:我知道在 Python 的 pymongo 中,当处理一个不存在的集合时,它会自动创建,但是,在 mongoose 中,事实并非如此。我无法将集合名称提供给新的文档对象。在api/hometask.js 的新对象中提供{collection: request.group} 时,在发出新请求时开始出现错误消息:MongooseError: document must have an _id before saving。我仍然无法理解导致此问题的原因。我将不胜感激!

  • 主文件夹架构:

  • server.js
const express = require('express')
require('dotenv').config()
const mongoose = require('mongoose')
const morgan = require('morgan')
const path = require('path')

let app = express();

const port = process.env.PORT || 3000;
mongoose.connect(process.env.uri, { useNewUrlParser: true })
.then(db => console.log('[ok] connected to db))
.catch(err => console.error(err))

app.use(express.json())
app.use(express.urlencoded({extended: false}))
app.use(morgan('dev'))
app.use('/api/hometasks', require('./api/hometask'))
app.use('/', express.static(path.join(__dirname, '../dist')))
app.listen(port)
  • api/hometask.js
const express = require('express');
const router = express.Router();

const Record = require('../models/hometask')

router.post('/', async (req, res) => {
    let request = req.body
    const record = new Record(request, {collection:request.group});
    try {
        await record.save();
        res.json({
            status: 'success'
        });  
    } catch (err) {
        console.log(err)
    }
})

module.exports = router
  • models/hometask.js
const mongoose = require('mongoose');
const { Schema } = mongoose;

let Record = new Schema({
  name: {
    type: String,
    required: true
  },
  description: {
    type: String,
    required: true
  },
  importance: {
    type: Boolean,
    required: true
  },
  group: {
    type: String,
    required: true
  }
});

module.exports = mongoose.model('hometask', Record);

【问题讨论】:

  • 您是否尝试过在创建架构时使用autoCreate 选项?
  • @boranseckin 是的,我得到了同样的MongooseError: document must have an _id before saving 错误

标签: node.js mongodb express mongoose


【解决方案1】:

在 mongoose 中,集合名称是按模型设置的,而不是按文档设置的。

请注意,Model 构造函数不采用选项对象。

您应该在创建模型时将调用中的集合名称设置为 mongoose.model,而不是在从该模型创建文档时。

【讨论】:

  • 感谢您解释它的工作原理,它真的很有帮助!
猜你喜欢
  • 2016-05-07
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2020-03-20
相关资源
最近更新 更多