首 页最新软件下载排行文章资讯投稿发布下载专题
维维下载站
您的位置:首页编程开发数据库类 → MongoDB用Mongoose获取到的对象不能增加属性完美解决办法教程

MongoDB用Mongoose获取到的对象不能增加属性完美解决办法教程

来源:维维整理 发布时间:2017-11-28 15:50:21 人气:

MongoDB用Mongoose获取到的对象不能增加属性完美解决办法教程,今天要给各位朋友分享的是关于MongoDB用Mongoose获得的对象无法增加属性的问题的解决方法,分享两种解决方案解决MongoDB用Mongoose得到的对象不能增加属性问题,有兴趣的朋友快来详细了解一下吧。

一、先定义了一个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被赋值。

相关下载
栏目导航
本类热门阅览