码迷,mamicode.com
首页 > 其他好文 > 详细

mongoose - 数据关系模型

时间:2017-05-23 18:14:43      阅读:379      评论:0      收藏:0      [点我收藏+]

标签:mod   插入数据   cal   else   log   文档   多对多   tle   pre   

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

作者:  张启卫

时间: 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: "774026263@qq.com",
  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: "774026263@qq.com",
  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: ‘774026263@qq.com‘,
  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 执行程序

David@zhangqiweideMacBook-Pro:~/04_web-fullstack/07_Express/DataAssociations$ node embed.js
{ _id: 5923f3d77ada40113ada1dcf,
  email: ‘774026263@qq.com‘,
  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: ‘774026263@qq.com‘,
  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: "mzhangqiwei@hotmail.com",
  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: "mzhangqiwei@hotmail.com"}, 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@hotmail.com的用户,将post数据插入,将保存数据

 

三、查询数据

  • 查找那个用户
  • 查找属于那个用户的所有post

 

//查找用户
//查找那个用户的所有post
User.findOne({email: "mzhangqiwei@hotmail.com"}).populate(‘posts‘).exec(function(err, user){
  if(err) {
    console.log(err);
  } else {
    console.log(user);
  }
});

 

mongoose - 数据关系模型

标签:mod   插入数据   cal   else   log   文档   多对多   tle   pre   

原文地址:http://www.cnblogs.com/elewei/p/6895316.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!