【问题标题】:How to define a model & method in mongoose midleware?如何在猫鼬中间件中定义模型和方法?
【发布时间】:2016-10-28 09:29:17
【问题描述】:

我是 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. mongoose.model('ContactModel',ContactSchema);中的'ContactModel'到底代表什么? 是自定义的名字还是db中的集合名?

    1. 我想为模型创建一个方法(crud task)

    ContactSchema.methods.selectAll = function (){ // code here }

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

$ 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 时。该怎么做?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

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

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

    的集合

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

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


    这种行为在猫鼬模型API reference 中有明确记录:

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

    【讨论】:

      【解决方案2】:

      我解决了我的问题。我们必须用

      的集合来映射我们
      var mongoose = require('mongoose'),
          Schema = mongoose.Schema;
      
      var ContactSchema = new Schema({
         name : String,
         email: String,
         number : String
      },{collection : 'contactlist'});
      

      我工作了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        • 2021-01-25
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 2021-06-29
        相关资源
        最近更新 更多