Mongoose不会创建新的集合

use*_*441 14 mongoose mongodb node.js

我在server.js中有以下内容:

    var mongoose = require('mongoose'),
    Schema = mongoose.Schema;
Run Code Online (Sandbox Code Playgroud)

和这样一个工作正常的模型!:

    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
    });
Run Code Online (Sandbox Code Playgroud)

并且有一个像下面的另一个模型不起作用!

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
});
Run Code Online (Sandbox Code Playgroud)

两个var如下:

var User = mongoose.model('User', userSchema);
var Job = mongoose.model('Job', jobSchema);
Run Code Online (Sandbox Code Playgroud)

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

mat*_*son 35

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

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

mongoose.model('Test', {
    author: {
    type: String,
    index: true
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的downvote,但你错了.自己测试一下.今天用猫鼬4.2.4重新测试.它确实创建了集合_if_集合中有一个索引. (10认同)

Joh*_*yHK 19

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

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

  • 检查下面我的答案,只有当模型没有索引时,这个答案才是正确的。 (3认同)

小智 6

首先要考虑的是,您是否已将连接字符串上的 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);
        });                                   
    });  
Run Code Online (Sandbox Code Playgroud)