如何从另一个引用模型填充猫鼬虚拟?

时间:2021-07-09 15:38:52

标签: javascript node.js mongodb mongoose

 // define a schema
  const personSchema = new Schema({
    name: {
      first: String,
      last: String
    }
  },
  {
    toJSON: {
      virtuals: true,
    },
    toObject: {
      virtuals: true,
    },
  },);
personSchema.virtual('fullName').
  get(function() {
    return this.name.first + ' ' + this.name.last;
    }).
  set(function(v) {
    this.name.first = v.substr(0, v.indexOf(' '));
    this.name.last = v.substr(v.indexOf(' ') + 1);
  });

  // compile our model
  const Person = mongoose.model('Person', personSchema);

这是从文档中定义 #virtuals

让我们有另一个引用 Person 的模型:

 const shopSchema = new Schema({
    name:String,
    owner: { type: Schema.Types.ObjectId, ref: "Person" },
  });
const Shop = mongoose.model('Shop', shopSchema);

现在,如何在商店填充 fullName 上获得 owner 虚拟物品。此处,所有者不包括 fullName

const getAllData = async () => {
     const shops = await Shop.find().populate("owner").lean();
     console.log(shops)
}

1 个答案:

答案 0 :(得分:1)

根据mongoose docs

<块引用>

使用lean() 可以绕过所有Mongoose 功能,包括virtuals、getter/setter 和默认值。如果你想通过lean()来使用这些功能,你需要使用相应的插件。

因此,fullName 已从返回的数据中删除。获取 fullName virtuals 的简单方法是将查询更改为如下所示:

const getAllData = async () => {
  const shops = await Shop.find()
    .populate({
      path: 'owner',
      options: {
        lean: false
      }
    })
    .lean();
  console.log(shops);
};

它不会在 lean() 中使用 populate,否则您可以完全禁用 lean()