【问题标题】:Embedding schemas is giving error嵌入模式给出错误
【发布时间】:2017-08-18 20:31:01
【问题描述】:

我正在尝试将架构嵌入到我创建的其他架构中,但我不断收到此错误:

我不完全确定这里出了什么问题,但我想做的是在用户模式中存储对我的事件模式和兴趣模式的引用。如果有人能告诉我我做错了什么,那将是非常感谢!

编辑:我现在收到一个新错误:

   /Users/Dynee/node_modules/mongoose/lib/schema.js:421
  throw new TypeError('Invalid value for schema Array path `' + prefix + key + '`');
  ^

TypeError: Invalid value for schema Array path `eventsHosted`
at Schema.add (/Users/Dynee/node_modules/mongoose/lib/schema.js:421:13)
at new Schema (/Users/Dynee/node_modules/mongoose/lib/schema.js:99:10)
at Object.<anonymous> (/Users/Dynee/Documents/eventure-rest-backend/Models/User.js:5:18)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/Dynee/Documents/eventure-rest-backend/Models/Event.js:2:43)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)

我的用户架构

var mongoose = require('mongoose');
var EventSchema = require('../Models/Event').schema;
var InterestSchema = require('../Models/Interest').schema;

var UserSchema = new mongoose.Schema({
    email: String,
    password: String,
    eventsHosted: [EventSchema],
    eventsAttended: [EventSchema],
    currentlyAttending: [EventSchema],
    currentlyHosting: [EventSchema],
    profileImage: String,
    interests: [InterestSchema],
    followers: [UserSchema],
    following: [UserSchema]

});

module.exports = mongoose.model('User', UserSchema);

我的事件架构

var mongoose = require('mongoose');
var UserSchema = require('../Models/User').schema;

var EventSchema = new mongoose.Schema({
    title: String,
    description: String,
    location: String,
    attendees: [UserSchema],
    date: String,
});

module.exports = mongoose.model('Event', EventSchema);

我的兴趣架构

var mongoose = require('mongoose');

var InterestSchema = new mongoose.Schema({
    name: String
});

module.exports = mongoose.model('Interest', InterestSchema);

【问题讨论】:

  • 我查看了那个帖子,它没有解决我的问题。

标签: node.js mongodb express mongoose schema


【解决方案1】:

这是因为您在模块中导出的不是Schemas,而是Models。当您执行var EventSchema = require('../Models/Event'); 时,您需要的是Event Model,而不是Event Schema。要从您的模型中访问底层架构,您可以执行以下操作:

var EventSchema = require('../Models/Event').schema;
var InterestSchema = require('../Models/Interest').schema;
var UserSchema = require('../Models/User').schema;

当您引用属于另一个集合的文档时也会遇到问题,这应该可以:

事件模型:

var mongoose = require('mongoose');
var UserSchema = require('./User').schema;

var EventSchema = new mongoose.Schema({
    title: String,
    description: String,
    location: String,
    attendees: [{ type: Schema.Types.ObjectId, ref: 'User' }],
    date: String
});

module.exports = mongoose.model('Event', EventSchema);

兴趣模型:

var mongoose = require('mongoose');

var InterestSchema = new mongoose.Schema({
    name: String
});

module.exports = mongoose.model('Interest', InterestSchema);

用户模型:

var mongoose = require('mongoose');
var EventSchema = require('./Event').schema;
var InterestSchema = require('./Interest').schema;

var UserSchema = new mongoose.Schema({
    email: String,
    password: String,
    eventsHosted: [{ type: Schema.Types.ObjectId, ref: 'Event' }],
    eventsAttended: [{ type: Schema.Types.ObjectId, ref: 'Event' }],
    currentlyAttending: [{ type: Schema.Types.ObjectId, ref: 'Event' }],
    currentlyHosting: [{ type: Schema.Types.ObjectId, ref: 'Event' }],
    profileImage: String,
    interests: [{ type: Schema.Types.ObjectId, ref: 'Interest' }],
    followers: [{ type: Schema.Types.ObjectId, ref: 'User' }],
    following: [{ type: Schema.Types.ObjectId, ref: 'User' }]
});

module.exports = mongoose.model('User', UserSchema);

How to reference another schema in my Mongoose schema? http://mongoosejs.com/docs/populate.html

【讨论】:

  • 您好!感谢您的回复,我将 .schema 添加到了每个导入的末尾,但是,我收到了一个类似的错误,用新错误编辑了我的帖子,如果你能看看我可能做错了什么,我会欣赏它。
  • 如果我想引用整个事件、用户或兴趣怎么办?举办的活动,参加的活动等。我想引用整个对象,而不仅仅是一个数字。也许我可以改为使用 Schema.Types.ObjectId,然后我可以访问我希望它引用的整个事件、用户或兴趣?
  • 现在已经修复了 ;)
  • 好的,我想我现在明白了,所以当我查询当前参加的活动时,我可以通过 id 访问它们,因为它是对 Event 的引用?非常感谢您的帮助我很感激!
  • 很好的答案!节省了我很多时间!
猜你喜欢
  • 1970-01-01
  • 2020-07-25
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2019-04-14
  • 1970-01-01
相关资源
最近更新 更多