如何从另一个引用模型填充mongoose virtual?

a2mppw5e  于 2021-09-23  发布在  Java
关注(0)|答案(1)|浏览(234)
// 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)
}

hrysbysz

hrysbysz1#

根据 Mongoose 文件:
使用lean()可以绕过所有mongoose特性,包括虚拟、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() 完全

相关问题