mongodb Mongoose不创建新集合

qlfbtfca  于 2023-04-11  发布在  Go
关注(0)|答案(5)|浏览(257)

我在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连接到它之后没有记录任何错误。有人知道我的第二个模型有什么问题吗?

mznpcxlj

mznpcxlj1#

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

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

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

km0tfn4u2#

Mongoose不会为模型创建jobs集合,直到该模型的第一个文档被保存。

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

vs91vp4v3#

首先要考虑的是,是否已将连接String上的autoIndex属性设置为True/False;

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

如果您将autoIndex设置为false,mongoose将不会自动为该连接关联的任何模型建立索引,即不会创建集合。在这种情况下,您必须手动调用model.ensureIndexes();通常人们在定义模型的同一个地方或者在控制器内部调用它,在我看来这对生产是不好的,因为它做了同样的事情,除了这次我们显式地做了。
我建议创建一个单独的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);
        });                                   
    });
30byixjq

30byixjq4#

另一个解决方案是在Schema对象中添加unique: true,我觉得很有效,mongoose会自动创建集合。
例如:

const moviesSchema = new Schema({
 name: {
    type: String,
    required: true // I'm writting about such one
    }
})
ecr0jaav

ecr0jaav5#

我不确定这是否是正确的答案,但请记住.js文件的名称必须与模型的名称相同,以大写字母开头命名模型,以小写字母开头命名文件(通常惯例)

相关问题