我在server.js中有以下内容:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
和一个像这样的模型,它工作得很好!:
var userSchema = new Schema({
firstName: { type: String, trim: true, required: true },
lastName: {type: String, trim: true, required: true},
cellPhoneNumber : {type: Number, unique: true},
email: { type: String, unique: true, lowercase: true, trim: true },
password: String
});
还有另一个模型,就像下面的一个,它不起作用!
var jobSchema = new Schema({
category: {type: Number, required: true},
title: {type: String, required: true},
tags: [String],
longDesc: String,
startedDate: Date,
views: Number,
report: Boolean,
reportCounter: Number,
status: String,
poster: String,
lastModifiedInDate: Date,
verified: Boolean
});
两个变量如下:
var User = mongoose.model('User', userSchema);
var Job = mongoose.model('Job', jobSchema);
-- mongod在server.js连接到它之后没有记录任何错误。有人知道我的第二个模型有什么问题吗?
5条答案
按热度按时间mznpcxlj1#
原因是,mongoose只会在启动时自动创建其中有索引的集合。您的User集合中有唯一的索引,而Job集合中没有。我今天遇到了同样的问题。
km0tfn4u2#
Mongoose不会为模型创建
jobs
集合,直到该模型的第一个文档被保存。vs91vp4v3#
首先要考虑的是,是否已将连接String上的autoIndex属性设置为True/False;
默认情况下,autoIndex属性设置为True,mongoose会在连接时自动构建您的schema中定义的索引。这对于开发来说很好,但对于大型生产部署来说并不理想,因为索引构建会导致性能下降。如果是这种情况,并且数据库中仍然没有创建集合,则问题可能是其他原因,与索引无关。
如果您将autoIndex设置为false,mongoose将不会自动为该连接关联的任何模型建立索引,即不会创建集合。在这种情况下,您必须手动调用model.ensureIndexes();通常人们在定义模型的同一个地方或者在控制器内部调用它,在我看来这对生产是不好的,因为它做了同样的事情,除了这次我们显式地做了。
我建议创建一个单独的node.js进程来显式地运行ensureIndexes,并将其与我们的主应用程序node.js进程分开。
这种方法的第一个优点是,我可以选择要运行ensureIndexes()的模型,第二个优点是,它不会在应用程序启动时运行,从而降低应用程序的性能,而是按需运行。
下面是我用来按需运行ensureIndexes的代码示例。
30byixjq4#
另一个解决方案是在Schema对象中添加
unique: true
,我觉得很有效,mongoose会自动创建集合。例如:
ecr0jaav5#
我不确定这是否是正确的答案,但请记住.js文件的名称必须与模型的名称相同,以大写字母开头命名模型,以小写字母开头命名文件(通常惯例)