一,先定義了一個goods(商品)的modelsmongodb
var mongoose = require('mongoose'); var Schema = mongoose.Schema; var productSchema = new Schema({ "productId":String, "producName": String, "salePrice":Number, "productImage":String }); module.exports=mongoose.model("Good",productSchema,'goods');
二,在定義一個users(用戶)的models數據庫
var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ "userId": String, "userName": String, "userPwd": String, "orderList": Array, "cartList": [ { "productId":String, "producName": String, "salePrice":Number, "productName": String, "productImage": String, "checked": String, "productNum": String } ], "addressList": Array }); module.exports = mongoose.model("User", userSchema, 'users') /*commonjs規範*/
上述兩個models的關係能夠看出:一個用戶對應一個購物車(cartList),一個購物車有多個商品對象json
如今咱們來爲用戶添加商品(咱們默認是能夠直接添加的)===>userDoc爲登陸後的用戶,咱們爲此用戶的購物車添加商品app
咱們goods路由中:mongoose
Goods.findOne({ productId: productId }, function (err1, doc) { if (err1) { return res.json({ status: "1", msg: err1.message }) } else { if (doc) {//商品 doc.productNum="1", doc.checked="1", userDoc.cartList.push(doc); userDoc.save(function (err2) { if (err2) { return res.json({ status: "1", msg: err2.message }) } else { return res.json({ status: "0", msg: '', result: "suc" }) } }) } } })
上述正常執行後,咱們並無在用戶的購物車中看到productNum和checked, 其他的屬性均被賦值。學習
這是爲何呢?ui
由於Mongoose是個ODM (Object Document Mapper),相似於操做關係型數據庫使用的ORM(Object Relational Mapper),咱們使用Mongoose取到的數據的結構是要依賴於咱們定義的schema結構的。增長的屬性在(goods)schema中沒有定義,因此咱們給goods臨時附加productNum和checked屬性是無效的。spa
在這裏須要說明一下,就是雖然咱們給schema附加屬性,可是這只是實現能真正掛在該schema上,並無添加到schema中。好比上述的只是想實如今添加商品的時候,順便把productNum和checked的值賦給users表中。咱們無須把屬性存儲到goods中。code
結論:mongodb中使用mongoose取到的對象不能增長屬性。對象
解決方法一,
在schema中直接增長鬚要補充的屬性。
var mongoose = require('mongoose'); var Schema = mongoose.Schema; var productSchema = new Schema({ "productId":String, "producName": String, "salePrice":Number, "productImage":String "checked": String, "productNum": String }); module.exports=mongoose.model("Good",productSchema,'goods');
這樣兩邊能夠對等實現,賦值。(有時候不是很好)
解決方法二,
把查詢到的結果clone一個對象,而後在新對象中補充屬性。
Goods.findOne({productId: productId}, function (err1, doc) { var newobj = null;//新對象 if (err1) { return res.json({ status: "1", msg: err1.message }) } else { if (doc) {//商品 newobj = {//新建立一個對象,實現轉換mongoose不能直接增長屬性的坑 productNum: "1", checked: "1", productId: doc.productId, producName: doc.producName, salePrice: doc.salePrice, productName: doc.productName, productImage: doc.productImage, } userDoc.cartList.push(newobj); userDoc.save(function (err2) { if (err2) { return res.json({ status: "1", msg: err2.message }) } else { return res.json({ status: "0", msg: '', result: "suc" }) } }) } } })
執行以後,咱們能夠看到mongodb數據中的users表的procuctNum和checked被賦值。
這個只是簡單的記錄一下在學習過程當中遇到的一些不太順的小坑。
有問題能夠留言一塊兒討論。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。