1. 程式人生 > >mongodb用mongoose得到的對象不能增加屬性解決

mongodb用mongoose得到的對象不能增加屬性解決

return pre fin arr proc common module 討論 結果

一,先定義了一個goods(商品)的models

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),一個購物車有多個商品對象

現在我們來為用戶添加商品(我們默認是可以直接添加的)===>userDoc

為登錄後的用戶,我們為此用戶的購物車添加商品

我們goods路由中:

 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, 其余的屬性均被賦值。

這是為什麽呢?

因為Mongoose是個ODM (Object Document Mapper),類似於操作關系型數據庫使用的ORM(Object Relational Mapper),我們使用Mongoose取到的數據的結構是要依賴於我們定義的schema結構的。增加的屬性在(goods)schema中沒有定義,所以我們給goods臨時附加productNum和checked屬性是無效的。

在這裏需要說明一下,就是雖然我們給schema附加屬性,但是這只是實現能真正掛在該schema上,並沒有添加到schema中。比如上述的只是想實現在添加商品的時候,順便把productNum和checked的值賦給users表中。我們無須把屬性存儲到goods中。

結論: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被賦值。

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

有問題可以留言一起討論。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

mongodb用mongoose得到的對象不能增加屬性解決