2013-06-11 6 views
37

Ben şemaları olan modeller oluşturmak için Mongoose.js kullanıyorum.Mongoose Modelinden şema öznitelikleri alındı ​​

Modellerim var (birçok) ve zaman zaman belirli bir modeli oluşturan öznitelikleri/anahtarları almak istiyorum.

Verilen herhangi bir model için öznitelik şemalarını çıkarmak için bir yöntem var mı? Örneğin

,

var mySchema = module.exports = new Schema({ 
    SID: { 
    type: Schema.Types.ObjectId 
    //, required: true 
    }, 
    teams: { 
    type: [String] 
    }, 
    hats: [{ 
    val: String, 
    dt: Date 
    }], 
    shields: [{ 
    val: String, 
    dt: Date 
    }], 
    shoes: [{ 
    val: String, 
    dt: Date 
    }] 
} 

);

Şema [SID, hats, teams, shields, shoes]'un niteliklerini dışarı çıkarmak/tanımlamak mümkün mü?

cevap

50

Evet, bu mümkün.

paths: { 
    number: [Object], 
    'name.first': [Object], 
    'name.last': [Object], 
    ssn: [Object], 
    birthday: [Object], 
    'job.company': [Object], 
    'job.position': [Object], 
    'address.city': [Object], 
    'address.state': [Object], 
    'address.country': [Object], 
    'address.street': [Object], 
    'address.number': [Object], 
    'address.zip': [Object], 
    email: [Object], 
    phones: [Object], 
    tags: [Object], 
    createdBy: [Object], 
    createdAt: [Object], 
    updatedBy: [Object], 
    updatedAt: [Object], 
    meta: [Object], 
    _id: [Object], 
    __v: [Object] 
} 

Sen de bir model aracılığıyla bu erişebilirsiniz:

Her şema (bu benim kod örneği) biraz şöyle bir paths özelliğine sahiptir. Model.schema.paths'un altında.

+0

Bir kaynak sağlayabilir misiniz? – user1460015

+0

Anlamıyorum. Bağlantı ister misin? – gustavohenke

+4

emin ... sadece soruları sormak yerine gelecekte başvurabileceğim bir şey. – user1460015

30

Yorum yapmak için yeterli sayıda temsilci yok, ancak bu aynı zamanda bir liste yayıyor ve tüm şema türlerinden geçiyor.

number 
name.first 
name.last 
ssn 
birthday 
job.company 
job.position 
address.city 
address.state 
address.country 
address.street 
address.number 
address.zip 
email 
phones 
tags 
createdBy 
createdAt 
updatedBy 
updatedAt 
meta 
_id 
__v 

Ya da bunun gibi bir Array olarak tüm Öznitelikler alabilir:

mySchema.schema.eachPath(function(path) { 
    console.log(path); 
}); 

yazdırmalısınız lodash için

var props = Object.keys(mySchema.schema.paths); 
+1

bu iyi bir şey değildir çünkü yöntemleri de dahil olmak üzere nesnenin tüm özelliklerini size verecektir! –

6

Çözüm, tüm şema özelliklerini aldı fonksiyonu, belirtilen hariç

_.mixin({ pickSchema: function (model, excluded) { 
    var fields = []; 
    model.schema.eachPath(function (path) { 
     _.isArray(excluded) ? excluded.indexOf(path) < 0 ? fields.push(path) : false : path === excluded ? false : fields.push(path); 
    }); 
    return fields; 
    } 
}); 

_.pickSchema(User, '_id'); // will return all fields except _id 

_.pick(req.body, _.pickSchema(User, ['_id', 'createdAt', 'hidden'])) // all except specified properties 

buradan daha fazla bilgi burada bulabilirsiniz https://gist.github.com/styopdev/95f3fed98ce3ebaedf5c

1

Sadece eklediğiniz özniteliklere sahip olmak istiyorsanız ve ORM tarafından '$ ___' ile başlayan yöntemlere sahip olmak istemiyorsanız, belgeyi nesneye dönüştürmeniz ve aşağıdaki gibi özelliklere erişmeniz gerekir: durumda

Object.keys(document.toObject()); 
0

Eğer (iç içe ve kalabalık özelliklerinin dahil) tüm özellik değerlerini olsun istiyorum, sadece toObject() yöntemi kullanın:

let modelAttributes = null; 
SomeModel.findById('someId').populate('child.name').exec().then((result) => { 
    modelAttributes = result.toObject(); 
    console.log(modelAttributes); 
}); 

çıkışı olacaktır:

{ 
    id: 'someId', 
    name: 'someName', 
    child: { 
    name: 'someChildName' 
    } 
    ... 
}