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被赋值。

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

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

时间: 2024-08-30 05:32:20

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

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

先定义了一个article的schema var mongoose = require('mongoose'); var Schema = mongoose.Schema; exports.schema = new Schema({ title: String,//标题 description: String,//描述 content: String,//内容 status:{type: Number, defalut: 0}, //未发布:0 ,发布:1 create_at: {type: D

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

node + koa2 + mongodb 写了一个给前端的接口 如果不是写这个接口,这辈子都发现不了mongodb里这个大坑 mongoose 是个ODM(Object Document Mapper),mongodb是nosql数据库,文档存储 mysql,sqlserver,oracle都是关系型数据库 所以mongodb无法在取到对象增加属性,必须在追加时候重新用一个对象,或者在schema中添加这个对象的key model.js // 这里用来建数据库表结构相关的 const mong

php 给对象动态增加属性

<?php error_reporting(-1); ini_set('display_errors','on'); class A { public $a = 'hello'; public function add() { $this->b = 'world'; }- public static function p() { echo 'world',PHP_EOL; }- } $a = new A; $a->add(); $a->c = 'test'; $a->p();

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

MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. MongoDB - 安装及运行 下载 07/05/2017 Current Stable Release (3.4.6) https://www.mongodb.com/dow

Node.js开发入门——MongoDB与Mongoose

为了保存网站的用户数据和业务数据,通常需要一个数据库.MongoDB和Node.js特别般配,因为MongoDB是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二进制格式)存储的,增删改查等管理数据库的命令和JavaScript语法很像.如果你在Node.js里访问MongoDB的数据,会有我们是一家人的感觉,特别亲切. 我也准备使用MongoDB来作为我的数据库. MongoDB使用集合(collection)和文档(document)来描述和存储数据,collection就相当

初学mongodb和mongoose

进入安装mongodb的文件夹下的bin文件夹,执行命令:mongo ,就可以使用mongodb了. 安装好mongoose后,在app.js中,首先引入mongoose这个模块: var mongoose = require('mongoose'); //连接到对应的数据库: //端口号默认链接27017: //test是数据库的名称,mongodb不需要建立数据库,当你需要连接的数据库不存在时,会自动创建一个: mongoose.connect('mongodb://localhost/te

[转] mongoDB与mongoose

mongoDB简介 mongoDB与一些关系型数据库相比,它更显得轻巧.灵活,非常适合在数据规模很大.事务性不强的场合下使用.同时它也是一个对象数据库,没有表.行等概念,也没有固定的模式和结构,所有的数据以文档的形式存储. ·由c++语言编写,是一个分布式文件存储的开源NoSQL数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能. · mongoDB旨在为web应用提供可扩展的高性能数据存储解决方案 · mongoDB将数据存储为一个文档,数据结构由键值对组成.mongoDB文档类

前端知识点回顾——mongodb和mongoose模块

mongodb和mongoose模块 数据库 数据库有关系型数据库(MySQL)和非关系型数据库(mongodb),两者的语法和数据存储形式不一样. mySQL 关系型数据库 类似于表格的形式,每一条数据都是以id为标识 table thead name sex age id tbody May female 18 1 Simple male 25 2 mongodb 非关系型数据库 集合,相当于表的概念,Bson,一条数据代表一个文档(数据的基本单位) { id : name : May ag

【重学Node.js 第3篇】mongodb以及mongoose的使用

mongodb以及mongoose的使用 本篇为这个系列的第三篇,想看更多可以直接去github的项目:https://github.com/hellozhangran/happy-egg-server 更多介绍可以看:https://www.cnblogs.com/zhangran/p/11963616.html mongodb mongodb是典型的非关系型数据库,关于它的背景介绍和优势劣势这里就不赘述,我们直接讲实操或者说最有可能用到的部分. mongodb常用指令 mongod --co