mongodb用mongoose獲得的對象不能增長屬性解決

一,先定義了一個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被賦值。

這個只是簡單的記錄一下在學習過程當中遇到的一些不太順的小坑。

有問題能夠留言一塊兒討論。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

相關文章
相關標籤/搜索