如何虚拟填充猫鼬中的多对多字段?

时间:2020-04-22 05:08:52

标签: javascript node.js mongodb mongoose mongoose-populate

我有一个通过我的猫鼬模式构建的Note模型和一个User模型。 Note模式包含字段consumer,它是User id的数组。 user模式中存在一个等效字段,但是仅在获取时才可用,因此实际上用其外来字段填充,如下所示。

但是,当存在Query Middleware时,即使consumedPosts具有ID数组且不存在ID时,从获取的数据中获取的consumer字段也只是一个空数组(已注释掉) )consumedPosts字段根本不可用(在获取的数据中)。

如何告诉我的虚拟模式consumer是一个数组?

// Notes Schema & Model

const noteSchema = new mongoose.Schema(
  {
    consumer: [
      {
        type: mongoose.Schema.ObjectId,
        ref: 'User',
      },
    ],
  }
)

const Note = mongoose.model('Note', noteSchema)

// User Schema & Model

const userSchema = new mongoose.Schema(
  {
    firstName: String,
    lastName: String,
  },
  {
    toJSON: { virtuals: true },
    toObject: { virtuals: true },
  }
)

// Virtual Populate

userSchema.virtual('consumedPosts', {
  ref: 'Note',
  foreignField: 'consumer',
  localField: '_id',
})

// Query Middleware

userSchema.pre(/^find/, function(next) {
  const options = '-__v -collaborator -consumer -creator -body'
  this.populate({
      path: 'consumedPosts',
      select: options,
    })
  next()
})

const User = mongoose.model('User', userSchema)

我的笔记文档来自MongoDB Atlas

{
  "_id":{"$oid":"5e9ef4939827691d7cb7e73b"},
  "consumer":[{"$oid":"5e451b091e6d286b04f19a4f"}],
  "__v":{"$numberInt":"0"}
}

我的邮递员用户文档

{ 
  "firstName":"Aakash",
  "lastName":"Meshram",
  "consumedPosts":[],
}

0 个答案:

没有答案