好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

MongoDB用Mongoose得到的对象不能增加属性完美解决方法(两种)

一,先定义了一个goods(商品)的models

?

1

2

3

4

5

6

7

8

9

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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路由中:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

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中直接增加需要补充的属性。

?

1

2

3

4

5

6

7

8

9

10

11

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一个对象,然后在新对象中补充属性。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

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得到的对象不能增加属性完美解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:http://HdhCmsTesttuohang.net/Linux/2017-11/148920.htm

查看更多关于MongoDB用Mongoose得到的对象不能增加属性完美解决方法(两种)的详细内容...

  阅读:26次