如何定义模型& mongoose midleware中的方法?

时间:2016-06-26 06:26:00

标签: node.js mongodb mongoose

我是mongodb和nodejs的新手。我创建了一个模式,如:

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var ContactSchema = new Schema({
   name : String,
   email: String,
   number : String
});

ContactSchema.methods.selectAll = function (callback){
    console.log("I got list contact");

    ContactModel.find({}).exec(function(err,items){
        if(err)
            console.error(err.stack);
        else{
            var notify = {
                'message' : 'select all document successfully',
                'data' : items,
                'status' : 1
            };

            console.log(notify);
            callback();
        };
    });
};

var ContactModel = mongoose.model('contactlist',ContactSchema);

module.exports = ContactModel;

假设我已使用'mongodb://localhost:27017/contactlist'连接到数据库。它有一个数据库名contactlist,一个集合contactlist和一些文件

> db.contactlist.find({})
{ "_id" : ObjectId("576e8ac6d68807e6244f3cdb"), "name" : "Tome", "email" : "Tome@gmail.com", "number" : "333-333-333" }
{ "_id" : ObjectId("576e8b4fd68807e6244f3cdc"), "name" : "Trace", "email" : "Trace@gmail.com", "number" : "444-444-444" }
{ "_id" : ObjectId("576e8b4fd68807e6244f3cdd"), "name" : "Tuker", "email" : "Tuker@gmail.com", "number" : "555-444-777" }
> 

我的问题

  1. 'ContactModel'中的mongoose.model('ContactModel',ContactSchema);代表什么? 这是一个名称是自定义的还是db中的集合名称?

    1. 我想创建一个模型方法(crud task)
    2. ContactSchema.methods.selectAll = function (){ // code here }

      此方法可以在mongo中选择集合的所有文档,但我的ContactModel.find函数返回空项。

      $ node server
      development server is running at 127.0.0.1 port 3000
      I got list contact
      { message: 'select all document successfully',
      data: [],
      status: 1 }
      undefined
      

      我的意思是当我使用猫鼬的find api时。怎么做?

2 个答案:

答案 0 :(得分:1)

很高兴你已经以某种方式解决了你的问题。但这只是为了解决您遇到的问题的根本原因。希望其他人觉得有帮助。

我认为你在mongoose之前创建了一个名为contactlist的数据库和一个名为contactlist的集合。并且mongoose试图变得聪明并将集合名称作为模型的复数名称(lib / npm源代码reference,并且所有相关规则在this file中定义)。在您的情况下,它可能已创建名为contactlists

的集合

虽然您可以选择在创建模型时通过将其作为第三个参数传递给模型来明确命名您的集合(您的方式):

var ContactSchema = new Schema({ name : String /* , .....  */ },{collection : 'contactlist'});

<小时/> mongoose模型API reference中明确记录了此行为:

  

当没有传递集合参数时,Mongoose通过将模型名称传递给utils.toCollectionName方法来生成集合名称。该方法使名称复数化。如果您不喜欢此行为,请传递集合名称或设置模式集合名称选项。

答案 1 :(得分:0)

我重新解决了我的问题。我们必须通过

为我们收集地图
<md-input-container class="md-block" flex-gt-sm>
   <h4>Image</h4>
   <input type="file" ng-model="post.primaryImage" />

</md-input-container>

我工作了!