3

私は次のスキーマ(CoffeeScript)を持っています:

adSchema = new mongoose.Schema({
  ...
  user : { type: mongoose.Schema.Types.ObjectId, ref: 'User' }
  ...
},
{
  toObject: { virtuals: true },
  toJSON: { virtuals: true }
})

userSchema = new mongoose.Schema({
  username : String
  email :
    type : String
    required : true
    index :
      unique : true
  adverts : [{ type: mongoose.Schema.Types.ObjectId, ref: 'Advert' }]
},
{
  toObject: { virtuals: true }
  toJSON: { virtuals: true }
})

userSchema.virtual('screenname').get () ->
  if this.username? then this.username else this.email.split('@')[0]+'@...'

次に、一連のレコードを取得して、ユーザーにデータを入力しようとします。

getAdvertPage = (obj, fn) ->
  page_size = 10
  query =
    tags : obj.tag
  Advert.count query, (err, count) ->
    Advert.find(query)
    .sort(obj.sort)
    .skip((obj.page-1)*page_size)
    .limit(page_size)
    .populate('user', 'screenname')
    .exec (err, ads) ->
      ads.lastPage = (obj.page-1)*page_size + page_size >= count
      fn err, ads

しかし、私はユーザーのスクリーンネームだけが必要で、他には何も必要ありません(これは仮想フィールドです)。ただし、これによりエラーが発生します。

Cannot call method 'split' of undefined

ポピュレートに電子メールを含めると正常に機能しますが、クライアントに電子メールを送信したくありません。仮想フィールドのみにデータを入力する方法はありませんか?

4

1 に答える 1

7

「screenname」の仮想ゲッター内の「email」および「username」フィールドに依存しているため、screenname、email、およびusernameを入力してみてください。

...
.populate('user', 'screenname, email, username')
...

ちなみに、このような状況を回避するために、仮想ゲッター内にビジネスロジックを実装しないでください。別の仮想を作成することを検討してください。

于 2013-01-13T19:38:31.777 に答える