13

Mongoose docs に記載されているように、単一の仮想属性を取得する方法を知っています。

PersonSchema
 .virtual('name.full')
 .get(function () {
   return this.name.first + ' ' + this.name.last;
});

しかし、私のスキーマが次の場合はどうでしょうか。

var PersonSchema = new Schema({
    name: {
      first: String
    , last: String
    },

    arrayAttr: [{
      attr1: String,
      attr2: String
    }]
})

そして、arrayAttr 内のネストされた各オブジェクトに仮想属性を追加したいと考えています。

PersonSchema.virtual('arrayAttr.full').get(function(){
    return attr1+'.'+attr2;
});

ここで何かを逃したかどうかを教えてください。

4

5 に答える 5

25

の要素に対して別のスキーマを定義し、attrArrayそのスキーマに仮想属性を追加する必要があります。

var AttrSchema = new Schema({
    attr1: String,
    attr2: String
});
AttrSchema.virtual('full').get(function() {
    return this.attr1 + '.' + this.attr2;
});

var PersonSchema = new Schema({
    name: {
      first: String
    , last: String
    },
    arrayAttr: [AttrSchema]
});
于 2012-11-29T18:15:37.430 に答える
7

もちろん、追加のスキーマを定義することもできますが、mongoose はすでにこれを行っています。

に保管されています。

PersonSchema.path('arrayAttr').schema

したがって、このスキーマに追加することで仮想を設定できます

PersonSchema.path('arrayAttr').schema.virtual('full').get(function() {
  return this.attr1 + '.' + this.attr2
})
于 2015-12-14T09:32:59.823 に答える
0

まず最初に書くべきは

this.some_attrそれ以外のsome_attr

また、arrayAttr にあるため、this.attr にアクセスすることはできません。したがって、たとえば次のことができます。

this.arrayAttr[0].attr1 + "." + this.arrayAttr[0].attr2

arrayAttr が空になる可能性があるため、これは安全ではありません

于 2012-11-29T17:51:40.527 に答える
-1

これに対する私のお気に入りの解決策は、ネストされたスキーマを直接参照することです。

PersonSchema.paths.arrayAttr.schema.virtual('full').get(function() {
  return this.attr1 + '.' + this.attr2;
});

また、注意すべき重要なことは、仮想はデフォルトでマングース スキーマによって返されないことです。そのため、ネストされたスキーマに文字列化プロパティを設定してください。

var options = { virtuals: true };
PersonSchema.paths.arrayAttr.schema.set('toJSON', options);
于 2017-05-25T15:09:44.443 に答える