zoukankan      html  css  js  c++  java
  • Mongoose在向集合中插入文档时的集合命名问题

    Mongoose使用结构化的模式应用到MongoDB集合,为MongoDB Node.js原生驱动程序提供了更多的功能和简化了数据库操作。

    从创建连接到向数据库中写入一个条数据经历了以下步骤:

    1.连接数据库,并创建连接;

    2.定义UserSchema(相当于数据库建表) ;

    3.创建User模型(相当于构建对象和数据库表映射);

    4.通过User模块,创建对象

    5.通过save方法持久化对象;

    (参考博客:Mongoose在创建Model时对Collection的命名策略http://www.tuicool.com/articles/R36bMbA)

    如下代码就可以在数据库中创建一个 users ( 为什么是users是本文的重点 ) 集合并插入一条文档:

     1 var mongoose = require('mongoose');
     2 var schema = mongoose.Schema;
     3 
     4 // 连接MongoDB
     5 mongoose.connect("mongodb://localhost:27017");
     6 
     7 // 定义模式
     8 var userSchema = new schema({
     9     name     : String,
    10     gender  : String,
    11     age     : Number
    12 });
    13 
    14 // 编译模型
    15 var User = mongoose.model('User', userSchema);
    16 
    17 // 新建文档对象实例
    18 var user1 = new User ({
    19     name   : "Jack",
    20     gender : "male",
    21     age    : 23
    22 });
    23 
    24 // 将文档保存到数据库
    25 user1.save(function(err, user1){
    26     if(err){
    27         return console.error(err);
    28     }else{
    29         console.info(user1);
    30     }
    31 });

    分析一下上面的代码,有几个问题(坑)需要注意:

    1.连接数据库没有指定数据库。

    Mongoose连接数据库建议的写法为: 

    mongoose.connect("mongodb://localhsot:port/databaseName");

    即在连接时指定localhost上的数据库,如果没有显式地指定,则默认连接到  MongoDB的  test  数据库,这一点要注意。

    2.定义模式或编译模型时没有指定集合。

    定义模式的语法是: new Schema( [defination], [options] )

    其中defination即文档中属性的定义,options为可指定的选项,包括autoIndex、collection、id、_id、strict等。

    一般在定义模式的时候直接指定collection,即需要创建模式的集合名称,如果不指定,可以在编译模型的时候进行指定。

    3.编译模型时没有指定集合。

    编译模型: model(name, [schema], [colleciton], [skipInit] )

    参数: name :标识model的字符串

          schema: 即前面定义的Schema对象

        collection:要连接的集合名称(如果在Schema对象中没有指定一个集合)

       skipInit: 默认为false,如果为true,则跳过初始化过程,创建一个没有连接到数据库的一个简单的Model对象。

    * 分析上面的代码,发现在Schema中没有指定集合,而在模型的定义中也没有指定集合,那么新建的文档将要插入到哪里呢?

    在MongoDB中,如果向一个不存在的集合中插入文档,则对应的数据库(默认为test)会创建一个集合,二Mongoose同样遵循这个原则,

    并且在新创建的数据库的命名上面也颇有讲究,

    判断模型名是否可数,如果不可数直接返回模型名作为新集合的名称;如果可数,则返回模型名的复数形式作为新集合的名称(模型名+'s') ;

    为了验证上述规则,运行上述的代码,并查看 test 数据库中的集合,如下:

    通过查询集合中的文档可以发现,新创建的集合名称为 users 。

    尝试修改模型名称为不可数,比如Fish, 再次运行代码,查看新建的集合名称:

    可以发现,此时的集合名称是fish, 说明上述的命名规则是正确的。

    总结一下: 

  • 相关阅读:
    晕倒的AIX
    MySQL Replication(zt)
    pxe启动网络安装CentOS(win平台)(zt)
    几句比较实用的script
    改注册表方式防DDOS攻击[ZT]
    一个免费空间列表相对集中的地方
    CREE LED的一个小资料
    下一步准备研究的东西:rsync远程同步
    PXE启动安装Linux (zt)
    系统调用
  • 原文地址:https://www.cnblogs.com/wx1993/p/5243245.html
Copyright © 2011-2022 走看看