保存到Mongoose时如何自动设置密钥名称?

时间:2014-03-02 19:26:10

标签: node.js mongodb mongoose

我有一个对象:

{ SKU: 'TR1234',
  Description: 'Item 1',
  UoM: 'each',
  client_id: '531382e3005fe0c926bd3957',
  Meta: { Test: 'test1', Image: 'http://www.aol.com' } }

我正在尝试根据我的架构保存它:

var ItemSchema = new Schema({
  sku: {
    type: String,
    trim: true,
  },
  description: {
    type: String,
    trim: true,
  },
  company_id: {
    type: Schema.ObjectId,
    ref: 'Client',
  },
  createdOn: {
    type: Date,
    default: Date.now
  },
  updatedOn: {
    type: Date,
    default: Date.now
  }
}, {versionKey: false});

但它没有保存,我认为这是因为大写的关键名称。但是,这些是从使用https://github.com/Keyang/node-csvtojson

解析的CSV动态生成的

想法?

2 个答案:

答案 0 :(得分:5)

如何在对象的每个键上调用toLowerCase(),并使用小写键构建一个新对象?

// Assumy your object name is obj
var newObj = {}; 
Object.keys(obj).forEach(function(key) {
    newObj[key.toLowerCase()] = obj[key];
});

// Here you can save your newObj

答案 1 :(得分:3)

你也可以在你的猫鼬模式中使用一个setter,就像那样:

function toLower (v) {
    return v.toLowerCase();
}

var UserSchema = new Schema({
    email: { type: String, set: toLower } 
});

只需将它应用到你的领域。

There is also one more approach, just:
email   : { type: String, lowercase: true }

更新密钥: 如果您想更改密钥,您应该采用下面提到的“ecdeveloper”方法。我的答案是价值观,所以将这种声誉赋予“ecdeveloper”是有意义的。抱歉令人困惑。

这是另一种不创建新对象的方法:

Object.prototype.keysToUpper = function () {
    var k;
    for (k in this) {
        if (this.hasOwnProperty(k))
            this[k.toLowerCase()] = this[k];
            delete this[k];    
    }
    return this;
};