mongoose - 数据关系模型

**********************

作者:  张启卫

时间: 2017年5月23号

功能: mongoDB 与 mongoose 数据关系模型

* 一对一

* 一对多

* 多对多

**********************

一、嵌入式的(Embed)

1. 添加mongoose模块, 连接数据库

var mongoose = require(‘mongoose‘);
mongoose.connect("mongodb://localhost/data_test");

2. 定义users文档

2.1 定义UserSchema

var userSchema = new mongoose.Schema({  email: String,  name: String,});

2.2 定义User模型

var User = mongoose.model("User", userSchema);

2.3 测试添加User数据

var newUser = new User({
  email: "[email protected]",
  name: "启卫"
});

2.4 测试保存数据

newUser.save(function(err, user){
  if(err) {
    console.log(err);
  } else {
    console.log(user);
  }
});

2.5 运行保存数据

node embed.js

3. 定义post文档

3.1 定义postSchema

// Post - title, content
var postSchema = new mongoose.Schema({
  title: String,
  content: String
});

3.2 定义Post模型

var Post = mongoose.model(‘Post‘, postSchema);

3.3 测试添加Post数据

var newPost = new Post({
  title: "MongoDB数据模型",
  content: "Embeded && Referencing"
});

3.4 测试保存数据

newPost.save(function(err, post){
  if(err) {
    console.log(err);
  } else {
    console.log(post);
  }
});

3.5 运行embed.js

node embed.js

4. 一个用户可以有多个post [一对多]

4.1 修改userSchema 数据模型,以嵌入的方式的定义

// Post - title, content
var postSchema = new mongoose.Schema({
  title: String,
  content: String
});
var Post = mongoose.model(‘Post‘, postSchema);

// User - email, name
var userSchema = new mongoose.Schema({
  email: String,
  name: String,
  posts: [postSchema]
});
var User = mongoose.model("User", userSchema);

注意: 这里必须将postSchma定义在userSchema之前,否则userSchema在验证时会报 postSchema 未定义

4.2 定义新的数据

var newUser = new User({
  email: "[email protected]",
  name: "启卫"
});

4.3 增加新的post数据

newUser.posts.push({
  title: "无法上网",
  content: "电脑重启过后,无法上网"
});

4.4 保存数据至数据库

newUser.save(function(err, user){
  if(err) {
    console.log(err);
  } else {
    console.log(user);
  }
});

4.5 运行程序测试

$ node embed.js{ _id: 5923f3d77ada40113ada1dcf,  email: ‘[email protected]‘,  name: ‘启卫‘,  __v: 1,  posts:   [ { title: ‘无法上网‘,       content: ‘电脑重启过后,无法上网‘,       _id: 5923f3d77ada40113ada1dd0 },     { title: ‘3 things I really hate‘,       content: ‘codeing, coding, coding‘,       _id: 5923f6d7d4f39e1258d6ebcb } ] }

^C

5. 查找且修改数据

5.1 使用findOne()函数来查找数据

User.findOne({name: "启卫"}, function(err, user) {
  if(err) {
    // console.log(err);
  } else  {
    console.log(user);
  }
});

5.2 执行程序

[email protected]:~/04_web-fullstack/07_Express/DataAssociations$ node embed.js
{ _id: 5923f3d77ada40113ada1dcf,
  email: ‘[email protected]‘,
  name: ‘启卫‘,
  __v: 0,
  posts:
   [ { title: ‘无法上网‘,
       content: ‘电脑重启过后,无法上网‘,
       _id: 5923f3d77ada40113ada1dd0 } ] }
^C

5.3 更新查找的数据内容

User.findOne({name: "启卫"}, function(err, user) {
  if(err) {
    // console.log(err);
  } else  {
    // console.log(user);
    //一旦查找到人,则插入post
    user.posts.push({
      title: "3 things I really hate",
      content: "codeing, coding, coding"
    });

    user.save(function(err, user) {
      if(err) {
        console.log(err);
      } else {
        console.log(user);
      }
    });
  }
});

5.4 执行程序

$ node embed.js
{ _id: 5923f3d77ada40113ada1dcf,
  email: ‘[email protected]‘,
  name: ‘启卫‘,
  __v: 1,
  posts:
   [ { title: ‘无法上网‘,
       content: ‘电脑重启过后,无法上网‘,
       _id: 5923f3d77ada40113ada1dd0 },
     { title: ‘3 things I really hate‘,
       content: ‘codeing, coding, coding‘,
       _id: 5923f6d7d4f39e1258d6ebcb } ] }

^C

二、对象引用 (Object References)

1. 初始化数据Schema

var mongoose = require(‘mongoose‘);
mongoose.connect("mongodb://localhost/references");

// Post - title, content
var postSchema = new mongoose.Schema({
  title: String,
  content: String
});
var Post = mongoose.model(‘Post‘, postSchema);

// User - email, name
var userSchema = new mongoose.Schema({
  email: String,
  name: String,
  posts: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Post"
    }
  ]
});
var User = mongoose.model("User", userSchema);

注意:在userSchema的posts中, 将type变为ObjectId, 将ref引用写成 Post

2. 使用User.create 测试数据

User.create({
  email: "[email protected]",
  name: "David"
});

3. 运行程序,查看数据库

4. 添加Post.create测试数据

Post.create({
  title: "电脑现在已经可以上网了",
  content: "网络现在已经通畅了"
}, function(err, post) {
  if(err) {
    console.log(err);
  } else {
    // console.log(post);
    User.findOne({email: "[email protected]"}, function(err, foundUser) {
      if(err) {
        console.log(err);
      } else {
        foundUser.posts.push(post);
        foundUser.save(function(err, data) {
          if(err) {
            console.log(err);
          } else {
            console.log(data);
          }
        });
      }
    });
  }
});

注意: 首先测试Post.create能否正常将数据插入数据库,然后查找email为mzhangqiwei[email protected]的用户,将post数据插入,将保存数据

三、查询数据

  • 查找那个用户
  • 查找属于那个用户的所有post
//查找用户
//查找那个用户的所有post
User.findOne({email: "[email protected]"}).populate(‘posts‘).exec(function(err, user){
  if(err) {
    console.log(err);
  } else {
    console.log(user);
  }
});
时间: 2024-11-05 14:49:07

mongoose - 数据关系模型的相关文章

数据库精华知识点总结(1)—数据库的三层模式和二级映像,E-R(实体联系图)图,关系模型

Data base: 长期存储在计算机内,有组织的,可共享的大量数据集合.基本特征:永久存储,可共享,有一定的物理和逻辑结构. Data base manage system(DBMS):用户和os之间的一层数据管理软件. 1.提供数据操纵语言DML对数据库增删改查 2.数据库的建立和维护 3.提供数据控制功能:在数据库建立,运行和维护时,DBMS管理数据的安全性,完整性,并发控制和故障的系统恢复,(也就是数据库的事务管理和运行管理) 4.与其它软件系统通信 Data base system(D

ThinkPHP 学习笔记 ( 三 ) 数据库操作之数据表模型和基础模型 ( Model )

//TP 恶补ing... 一.定义数据表模型 1.模型映射 要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态.代码: public function testdb(){ $obj=M("User"); dump($obj); } 此时浏览器输出: object(Model)#5 (20) { ["_extModel:private"] => NULL ["db:protecte

关系模型介绍

2.1 关系数据库的结构 关系数据库由表(table)的集合构成,每个表有唯一的名字.例如,instructor表记录了有关教师的信息,它有四个列首:ID.name.dept_name和salary.该表中每一行记录了一位教师的信息,包括该教师的ID.name.dept_name以及salary.类似的,course表存放了关于课程的信息,包括每门课程的course_id.title.dept_name和credits.注意,每位教师通过ID列的取值进行标识,而每门课程则通过course_id列

数据库系统原理——ER模型与关系模型

    数据库系统是软件的一种,数据库系统自然而然也有他自己的生命周期--生存期.它的生存期从规划开始,一直到将它卸载不用了.它的中间过程很复杂,为了实现用户的想法,数据库有关人员将现实生活中的数据进行抽象,然后在进行分类与操作,让后将数据整合到一起,将它们封装成了一个系统让用户使用它,最后数据库有关人员在对它们的成果进行不断地维护,这样不仅满足了用户的需要,还体现了全心全意为人民服的观点.     1  软件与数据库的关系     数据库系统是软件这一个超类的实例化成的一个子类而已,当然,还可

数据仓库数据库设计方法---关系模型和多维模型比较分析

数据仓库中广泛采用的数据库设计模型有两种:关系型和多维型.普遍认为在数据仓库的设计方法中关系模型是“Inmon”方法而多维模型是“Kimball”方法. 先来看下关系模型,关系型数据以一种称为“标准化”的形式存在.数据标准化是指数据库设计会使数据分解成非常低的粒度级,标准化数据以一种孤立模式 存在,这种情况下对数据表里的数据关系要求很严格.一般遵循3NF范式.采用关系型设计的数据库一般具有较强的灵活性和多功能性(可以支持数据的多种视 图). 再来看下多维模型,多维模型一般有星型模式.雪花模式.混

关系模型的三种完整性【转】

关系模型的完整性 关系模型中的完整性是指数据库中数据的正确性和一致性. 数据完整性由数据完整性规则来维护,包括实体完整性规则和参照完整性规则. 当然任何给定数据库中还要包括与应用有关的完整性规则.这类完整性规则并不是关系模型特有的,将其称为用户定义的完整性规则. 1.实体完整性规则 实体完整性:关系的主属性,即主键的组成不能为空,也就是关系的主属性不能是空值. 实体完整性是针对基本表的. 在机器上实际存储数据的表称为基本表.除此之外,查询结果表是临时表:视图是虚表,是不实际存储数据的表. 具体地

MongoDB数据关系建模

MongoDB中的数据是非常灵活的,集合中也不强制文档要采用统一的结构.但是认真考虑数据模型依然是非常重要的,因为这会影响到应用程序性能和数据库的能力.本文讲述了MongoDB中常见的一对一.一对多关系模型如如何建模. (1)一对一嵌入式文档模型(Embedded Document Model) 假设赞助商和住址是一种一对一关系,赞助商只有一处住址.赞助商可以看成是住址的属性或字段,住址也可以看成是赞助商的一个属性或字段.在类似于这种关系中,使用嵌入式数据模型(Embedded)的好处就是在一次

flask中常见的关系模型定义

flask中常见的关系模型定义一对多应用场景:角色与所属于该角色的用户(角色表与多用户表) [Python] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 class Role(db.Model):     __tablename__ = 'roles'     id = db.Column(db.Integer, primary_key=True)     name = db.Column(db.String(64), unique=True)     

数据库-关系模型

在用户观点下,逻辑结构是一张二维表 关系-一张表 Tuple 元组一行 attribute一列一个属性 主码 (key)某个属性组 可以确定一个唯一元组 域(Domain ):一组具有相同数据类型值的集合 分量-元组中的一个属性值 关系模型-对关系的描述 关系名(属性1,属性2....) 在关系模型中每个分量不可再分 数据操作是集合操作操作对象和结果都是关系,用户只要知道找什么就行不用知道怎么找 完整性约束条件: 实体完整性 参照完整性 用户定义完整性 优点: 建立在数学概念上,而已概念单一.