zoukankan      html  css  js  c++  java
  • 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: Date, default: Date.now}//添加时间 
    });
    

    增加一条测试数据:

    var o = new articleModel();
    o.title = 'hello';
    o.content = '这是一篇测试文章';
    o.save(function(err,result){
        if(err){
            console.log(err.message);
        }
        console.log(result);
    });
    

    下面使用findOne方法获取这条记录,在获取到的记录上增加一个remark属性,并在控制台输出结果

    articleModel.findOne({title: 'hello'}, function (err, article) {
        article.remark = '备注';
        console.log(article);
    });
    结果:{
      "content":"这是一篇测试文章",
      "title":"hello",
      "_id":"56f5ee83fcfad37f1371e952",
      "__v":0,
       "status":0,
      "create_at":"2016-03-26T02:05:55.814Z"
    }
    

    发现结果中remark属性没有显示,同时在schema中声明过的description也没有显示(因为增加数据的时候就没有设置description的值)。我现在把description也设置一个值看看查询结果:

    articleModel.findOne({title: 'hello'}, function (err, article) {
        article.remark = '备注';
        article.description = '这是描述';
        console.log(article);
    });
    结果:{"description":"这是描述",
       "content":"这是一篇测试文章",
       "title":"hello",
       "_id":"56f5ee83fcfad37f1371e952",
       "__v":0,
       "status":0,
       "create_at":"2016-03-26T02:05:55.814Z"
     }
    

    我们在发现description赋值成功,但是增加的remark属性还是无效。

    这是为什么呢?因为Mongoose是個ODM (Object Document Mapper),类似于操作关系型数据库使用的ORM(Object Relational Mapper),我们使用Mongoose取到的数据的结构是要依赖于我们定义的schema结构的。增加的remark属性在schema中没有定义,所以我们在取到的结果中增加remark属性是无效的,而description属性先前在结构中有定义(不算新增),所以可以重新设置值。

    结论:mongodb中使用mongoose取到的对象不能增加属性。

    接着问题是,如果我需要在结果中补充新的属性使用怎么办?

    方法1、在schema中直接增加需要补充的属性。

    exports.schema = new Schema({
        title: String,//标题
        description: String,//描述
        content: String,//内容    
        remark:String, //备注(补充新属性,现在和description一样了)
        create_at: {type: Date, default: Date.now}//添加时间
    });
    

    方法2、把查询到的结果clone一个对象,然后在新对象中补充属性。

    articleModel.findOne({title: 'hello'}, function (err, article) {
      var newobj = null;
      if(article){
          newobj = {
            _id:article._id,
            title: article.title,//标题
            description: article.description,//描述
            content: article.content,//内容
            remark:"备注",
            create_at: article.create_at,
         status: article.status,
         status_name: article.status==1?'发布':'未发布';
        	};
      }
        console.log(newobj); 
    });
    

    方法3:像上面的例子在schema中已经有了status表示状态,如果我们仅仅需要一个status_name显示文章状态的中文解释。不要clone新对象的方式,可以使用schema的虚拟属性。

    声明修改一下如下:
    var mongoose = require('mongoose');
    var Schema = mongoose.Schema;
    var schema = new Schema({
        title: String,//标题
        description: String,//描述
        content: String,//内容
        status: {type: Number, defalut: 0}, //未发布:0 ,发布:1
        create_at: {type: Date, default: Date.now}//添加时间
    });
    schema.virtual('status_name').get(function () {
        return this.status == 1 ? '发布' : '未发布';
    });
    exports.schema = schema;
    
    查询到结果后可以直接使用status_name属性:
    articleModel.findOne({title: 'hello'}, function (err, article) {
        console.log(article.stauts_name); 
    });
    
  • 相关阅读:
    geth搭建以太坊私链及常用操作
    什么是区块链?
    linux的命令
    MySQL的sql优化
    如何防止秒杀抢购超卖?
    try catch影响Spring事务吗?
    mysql中InnoDB与MyISAM的区别
    进程和线程的区别
    Nginx采用yum安装方式及安装后的目录
    Springboot2.0中jpa默认创建的mysql表为myisam引擎问题
  • 原文地址:https://www.cnblogs.com/fhen/p/5322493.html
Copyright © 2011-2022 走看看