1. 程式人生 > >mongoose - 數據關系模型

mongoose - 數據關系模型

4.5 push real console *** 3.5 模塊 conn eid

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

作者: 張啟衛

時間: 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 protected],將post數據插入,將保存數據

三、查詢數據

  • 查找那個用戶
  • 查找屬於那個用戶的所有post

//查找用戶
//查找那個用戶的所有post
User.findOne({email: "[email protected]"}).populate(‘posts‘).exec(function(err, user){
  if(err) {
    console.log(err);
  } else {
    console.log(user);
  }
});

mongoose - 數據關系模型