一,先定义了一个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: "",
msg: err1.message
})
} else {
if (doc) {//商品 doc.productNum="",
doc.checked="", userDoc.cartList.push(doc);
userDoc.save(function (err2) {
if (err2) {
return res.json({
status: "",
msg: err2.message
})
} else {
return res.json({
status: "",
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: "",
msg: err1.message
})
} else {
if (doc) {//商品
newobj = {//新创建一个对象,实现转换mongoose不能直接增加属性的坑
productNum: "",
checked: "",
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: "",
msg: err2.message
})
} else {
return res.json({
status: "",
msg: '',
result: "suc"
})
}
})
}
}
})

执行之后,我们可以看到mongodb数据中的users表的procuctNum和checked被赋值。

这个只是简单的记录一下在学习过程中遇到的一些不太顺的小坑。

有问题可以留言一起讨论。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

mongodb用mongoose得到的对象不能增加属性解决的更多相关文章

  1. mongodb用mongoose取到的对象不能增加属性

    先定义了一个article的schema var mongoose = require('mongoose'); var Schema = mongoose.Schema; exports.schem ...

  2. mongodb用mongoose查库的对象,不能增加属性

    node + koa2 + mongodb 写了一个给前端的接口 如果不是写这个接口,这辈子都发现不了mongodb里这个大坑 mongoose 是个ODM(Object Document Mappe ...

  3. php 给对象动态增加属性 及子类继承父类的构造方法

    <?php error_reporting(-1); ini_set('display_errors','on'); class A { public $a = 'hello'; public  ...

  4. 前端笔记之NodeJS(四)MongoDB数据库&Mongoose&自制接口&MVC架构思想|实战

    一.MongoDB数据库 1.1 NoSQL简介 随着互联网web2.0网站的兴起,传统的SQL数据库(关系数据库)在应付web2.0网站,特别是超大规模和高并发的SNS(social network ...

  5. mongoDB (mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储 ...

  6. MongoDB 和 Mongoose 04

    一.安装 1. 相关 https://www.mongodb.org/dl/win32/ MongoDB的版本偶数版本为稳定版,奇数版本为开发版 MongoDB对于32位系统支持不佳,所以3.2版本以 ...

  7. [转] mongoDB与mongoose

    mongoDB简介 mongoDB与一些关系型数据库相比,它更显得轻巧.灵活,非常适合在数据规模很大.事务性不强的场合下使用.同时它也是一个对象数据库,没有表.行等概念,也没有固定的模式和结构,所有的 ...

  8. Practical Node.js (2018版) 第5章:数据库 使用MongoDB和Mongoose,或者node.js的native驱动。

    Persistence with MongoDB and Mongoose https://github.com/azat-co/practicalnode/blob/master/chapter5/ ...

  9. Node.js开发——MongoDB与Mongoose

    为了保存网站的用户数据和业务数据,通常需要一个数据库.MongoDB和Node.js特别般配,因为MongoDB是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二进制格式)存储的,增删改 ...

随机推荐

  1. MapReduce-join连接

    join连接 MapReduce能够执行大型数据集间的连接(join)操作.连接操作的具体实现技术取决于数据集的规模及分区方式连接操作如果由mapper执行,则称为“map端连接”:如果由reduce ...

  2. spring: ?.运算符

    ?.运算符 对于被调用方法的返回值来说,我们同样可以调用它的方法.例如,如果selectArtist()方法返回的是一个String,那么可以调用toUpperCase()将整个名字改为大写字母形式: ...

  3. django实现日期分类效果

    日期分类效果图 实现功能:能够按照月份进行分类,统计每个月份的文章数量,没有文章的月份不显示.点击每栏可以链接的当月的文章列表. 每月文章列表可以使用django的通用视图MonthArticleVi ...

  4. 开发一个app需要多少钱

    App应用开发是目前最热门的产业,很多企业都想通过app的开发来进入移动互联网市场分一杯羹. 那么你一定很想知道开发一个app需要多少钱吧?那下面企业帮就来帮大家计算一下费用吧. 面对app抄袭成风的 ...

  5. 识别设备是IOS还是安卓

    var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...

  6. SVN中如何为文件夹中的所有文件加锁

    经过一段时间的试用,发现不加锁的共享式开发还是不太方便.还是全部设置为独占式加锁,如有共享式修改需求再设置为不加锁比较好. 经过一番摸索,总结出如下的加锁方式是可行的: 注:第一步是必须的,必须完成第 ...

  7. BitmapUtil(高效压缩不失真)

    package com.changim.patient.app.utils; import android.app.Activity; import android.content.ContentRe ...

  8. Spring_总结_03_装配Bean(一)_自动装配

    一.前言 本文承接上一节:Spring_总结_02_依赖注入 在上一节我们了解到依赖注入的实质就是装配. 这一节我们来学习下装配Bean的相关知识. 二.Bean的装配机制 1.三种装配机制 Spri ...

  9. Rational Rose 2003 下载、破解及安装方法(图文)

    方法一: 1. 安装Rational Rose2003时,在需选择安装项的时候,只选择Rational Rose EnterPrise Edition即可,不需选择其他项,之后选择“DeskTop I ...

  10. 普通方法实现——远程方法调用RMI代码演示

    1.spring_RMI01_server服务端 package com.wisezone.service; import java.rmi.Remote; import java.rmi.Remot ...