Mongoose不会创建新的集合

时间:2015-07-24 18:40:25

标签: node.js mongodb mongoose

我在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如下:

var User = mongoose.model('User', userSchema);
var Job = mongoose.model('Job', jobSchema);

- 在连接server.js后,mongod不会记录任何错误。 有人知道我的第二个模特有什么问题吗?

4 个答案:

答案 0 :(得分:32)

原因是,mongoose仅在启动时自动创建具有索引的集合。您的User集合中包含唯一索引,而Job集合则没有。我今天遇到了同样的问题。

// example code to test
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

mongoose.model('Test', {
    author: {
    type: String,
    index: true
    }
});

答案 1 :(得分:16)

在保存该模型的第一个文档之前,Mongoose不会为模型创建jobs集合。

Job.create({category: 1, title: 'Minion"}, function(err, doc) {
    // At this point the jobs collection is created.
});

答案 2 :(得分:2)

首先要考虑的是,如果您已将连接字符串上的autoIndex属性设置为 True / False ;

默认情况下,autoIndex属性设置为True ,mongoose会在连接时自动构建模式中定义的索引。这对于开发很有用,但对于大型生产部署来说并不理想,因为索引构建可能会导致性能下降。如果是这种情况并且仍未在数据库中创建集合,则问题可能是其他问题而与索引无关。

如果您将 autoIndex设置为false ,则mongoose不会自动为与此连接关联的任何模型构建索引,即它不会创建集合。在这种情况下,您必须手动调用model.ensureIndexes();通常人们在他们定义模型的地方或他们的控制器内部调用它,在我看来这对生产是不利的,因为它做同样的事情autoIndex true,除非这次我们明确地做了。

我建议创建一个单独的node.js进程来显式运行ensureIndexes并将其与我们的主应用程序node.js进程分开。

这种方法的第一个优点是我可以选择我想要运行的模型ensureIndexes()和第二个它在应用程序启动时运行并降低我的应用程序性能而不是按需运行它

以下是我用于按需运行ensureIndexes的代码示例。

import mongoose from 'mongoose';
var readline =  require('readline');

//importing models i want 

import category from '../V1/category/model';
import company from '../V1/company/model';
import country from '../V1/country/model';
import item from '../V1/item/model';


//Connection string options

let options = {useMongoClient:true,
autoIndex:false, autoReconnect:true, promiseLibrary:global.Promise};  

//connecting
let dbConnection = mongoose.createConnection('mongodb://localhost:1298/testDB', options);

 //connection is open
 dbConnection.once('open', function () {

        dbConnection.modelNames()
                    .forEach(name => {
            console.log(`model name ${name}`);                                        
            dbConnection.model(name).ensureIndexes((err)=> {
                if(err) throw new Error(err);              
            });

            dbConnection.model(name).on('index',function(err){                
                if (err) throw new Error(err); 
            });                                      
        });

        console.log("****** Index Creation was Successful *******");
        var rl = readline.createInterface({input:process.stdin,output:process.stdout});        
        rl.question("Press any key to close",function(answer){
            process.exit(0);
        });                                   
    });  

答案 3 :(得分:0)

解决此问题的另一种方法是在一个Schema对象中添加ModuleA。它对我有用,猫鼬会自动创建收藏夹。

例如:

ModuleB