mongoose链接两个集合,_id在express中,插入id作为数字或字符串



你好,我想创建两个集合第一个集合是room,有一些属性_id作为主键或对象id插入到post方法中另一个集合是booking,有一些属性我想存储id或对象id插入到booking集合的第一个集合中将两个集合相互连接并填充

const mongoose=require('mongoose');
const Schema =mongoose.Schema;
const bcrypt=require('bcryptjs');
const  schema  = mongoose.Schema;
//---------- schema data -------------//
const roomschema=Schema({
_id:{
type:String ,
},
floor:{
type:String,
required:true
},
status:{
type:String,
enum:['booking','busy','free'],
default:'free'
},
price:{
type:String,
},
bed:{
type:Number
},
offer:{
type:String,
enum:['yes','no'],
default:'no',
} 
});
const room =mongoose.model('room',roomschema);
const roombooking= Schema({
_id:
{
type:Schema.Types.ObjectId,
ref: 'room' ,
},
bed:{
type:String,
},
price:{
type:String,
required:true,
},
from:{
type:Date,
default:Date.now,
},
to:{
type:Date,
default:Date.now,
},
});
const booking =mongoose.model('booking',roombooking);
module.exports={
room:room,
booking:booking
};

这是我创建的模式文件但是我有一个错误强制转换

Error: booking validation failed: _id: Cast to ObjectId failed for value "12" at path "_id"
at ValidationError.inspect (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooseliberrorvalidation.js:47:26)
at formatValue (internal/util/inspect.js:725:31)
at inspect (internal/util/inspect.js:293:10)
at formatWithOptions (internal/util/inspect.js:1949:40)
at Object.value (internal/console/constructor.js:301:14)
at Object.log (internal/console/constructor.js:336:61)
at C:UsersDCDesktopdatapagehotelapptestmodelscontroller.js:103:17
at processTicksAndRejections (internal/process/task_queues.js:97:5) {
errors: {
_id: CastError: Cast to ObjectId failed for value "12" at path "_id"
at ObjectId.cast (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibschemaobjectid.js:281:11)
at ObjectId.SchemaType.applySetters (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibschematype.js:1091:12)
at model.$set (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibdocument.js:1269:20)
at model.$set (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibdocument.js:1013:16)
at model.Document (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibdocument.js:148:12)
at model.Model (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibmodel.js:105:12)
at new model (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibmodel.js:4700:15)
at booking (C:UsersDCDesktopdatapagehotelapptestmodelscontroller.js:97:16)
at Layer.handle [as handle_request] (C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterlayer.js:95:5)
at next (C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterroute.js:137:13)
at Route.dispatch (C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterroute.js:112:3)
at Layer.handle [as handle_request] (C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterlayer.js:95:5)
at C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterindex.js:281:22
at Function.process_params (C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterindex.js:335:12)
at next (C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterindex.js:275:10)
at Function.handle (C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterindex.js:174:3) {
stringValue: '"12"',
messageFormat: undefined,
kind: 'ObjectId',
value: '12',
path: '_id',
reason: Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
at new ObjectID (C:UsersDCDesktopdatapagehotelapptestnode_modulesbsonlibbsonobjectid.js:59:11)
at castObjectId (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibcastobjectid.js:25:12)
at ObjectId.cast (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibschemaobjectid.js:279:12)
at ObjectId.SchemaType.applySetters (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibschematype.js:1091:12)
at model.$set (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibdocument.js:1269:20)
at model.$set (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibdocument.js:1013:16)
at model.Document (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibdocument.js:148:12)
at model.Model (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibmodel.js:105:12)
at new model (C:UsersDCDesktopdatapagehotelapptestnode_modulesmongooselibmodel.js:4700:15)
at booking (C:UsersDCDesktopdatapagehotelapptestmodelscontroller.js:97:16)
at Layer.handle [as handle_request] (C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterlayer.js:95:5)
at next (C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterroute.js:137:13)
at Route.dispatch (C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterroute.js:112:3)
at Layer.handle [as handle_request] (C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterlayer.js:95:5)
at C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterindex.js:281:22
at Function.process_params (C:UsersDCDesktopdatapagehotelapptestnode_modulesexpresslibrouterindex.js:335:12)
}
},
_message: 'booking validation failed'
}

这是插入房间收集方法

insertroom = function(req,res){
const {_id,floor,status,price,bed}=req.body;
const newroom =new rooms.room({_id,floor,status,price,bed});
newroom.save()
.then(()=>res.redirect('/getroom'))
.catch((err)=>console.log(err));
};

,这是插入预订方法

booking =function(req,res){
const {_id,price,from,to,bed}=req.body;
const message={}
const fee =new rooms.booking({_id,price,from,bed,to});
fee.save().then(()=>{
res.redirect('/updateroom',);
})
.catch((err)=>{
res.redirect('/dashboard');
console.log(err)});
}

在Schema前使用new:

const roomschema= new Schema({...})