Mongodb 在Mongoose中使用Virtuals的优势

Mongodb 在Mongoose中使用Virtuals的优势,mongodb,mongoose,Mongodb,Mongoose,我想展示一下在猫鼬中使用虚拟技术建立关系的优势。它会导致更快地从数据库中检索信息吗?虚拟现实是给定模型的附加字段。它们的值可以通过定义的功能手动或自动设置。公共虚拟财产是一个人的全名,由用户的名字和姓氏组成 虚拟属性不会在数据库中持久化。它们仅在逻辑上存在,不写入文档集合 范例 猫鼬模式 用户架构有两个属性指示用户的名字和姓氏:first和last // define user schema var userSchema = new Schema({ first: String,

我想展示一下在猫鼬中使用虚拟技术建立关系的优势。它会导致更快地从数据库中检索信息吗?虚拟现实是给定模型的附加字段。它们的值可以通过定义的功能手动或自动设置。公共虚拟财产是一个人的全名,由用户的名字和姓氏组成

虚拟属性不会在数据库中持久化。它们仅在逻辑上存在,不写入文档集合

范例

猫鼬模式

用户架构有两个属性指示用户的名字和姓氏:
first
last

// define user schema
var userSchema = new Schema({  
    first: String,
    last: String
});

// compile our model
var User = mongoose.model('User', userSchema);

// create a document
var mentalist = new User({  
    first: 'Patrick',
    last: 'Jane'
});
假设我们想要获得精神主义者的全名,我们可以手动添加从第一个到最后一个属性:

console.log(mentalist.first + ' ' + mentalist.last); // Patrick Jane  
定义虚拟财产

实际上,有一种更好的方法可以获取用户的全名:虚拟字段。使用virtuals,您可以只编写一次名称连接

Mongoose将虚拟字段的定义拆分为GETSET方法

获取方法

virtuals get方法是一个返回虚拟值的函数。您可以执行复杂的处理,也可以仅连接单个文档字段值

userSchema.virtual('fullname').get(function() {  
    return this.first + ' ' + this.last;
});
上面的代码示例只是连接第一个和最后一个属性值。这样,虚拟全名属性现在将打印与上面相同的输出:

console.log(mentalist.fullname); // Patrick Jane  
设置方法

setter方法对于拆分字符串或执行其他操作非常有用。通过传递适当的函数定义虚拟setter并执行所需的处理。下面的示例将传递的名称变量拆分为任意空格

userSchema.virtual('fullname').set(function (name) {  
  var split = name.split(' ');
  this.first = split[0];
  this.last = split[1];
});
名称的第一部分指定给第一个属性,第二部分指定给最后一个属性。此集合方法将覆盖以前的模型值,并将传递的值指定为fullname属性

var humor = new User({  
    first: '',
    last: ''
});

humor.fullname = 'Kimball Cho';  
console.log(humor.first); // Kimball  
console.log(humor.last);  // Cho  
查询和字段选择

Virtuals不可用于文档查询或字段选择。只有非虚拟属性可用于查询和字段选择

如您所见,虚拟属性不是静态模型属性。他们 其他模型函数是否返回基于默认值的值 架构字段


你能举个例子说明你想如何在你的模式中使用虚拟现实吗?Virtuals不会加快任何速度,但会为设置关系和检索文档增加便利