mongoose - 數據關系模型
阿新 • • 發佈:2017-05-23
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 - 數據關系模型