将 Mongoose 对象从 id 填充到新字段
Populating Mongoose objects from id to new field
我正在使用 mongoose 将 id 字段与各自的文档一起填充到新的 field.my 问题是假设我的购物车模型是 -
let CartSchema = new mongoose.Schema({
userId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
productIds: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Product'
}
]
});
我想填充产品所以我使用了
Cart.find({}).populate("products").exec(function (err, cart) {
console.log(cart)
}
但这会在相同的字段名称 productIds 中填充文档,我想在一个名为 "products" 的新字段名称中填充这些字段,所以我尝试了这个
let CartSchema = new mongoose.Schema({
userId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
productIds: [
{
type: String
}
]
}, { toJSON: { virtuals: true } });
CartSchema.virtual('products', {
ref: 'Product',
localField: 'productIds',
foreignField: '_id',
});
Cart.find({}).populate("products").exec(function (err, cart) {
console.log(cart)
}
但返回了名为 products.so 的空数组,我如何将 productIds 数组填充到新的字段名称 products 及其各自的文档数组。
谢谢。
在技术上做您想做的事情违反了使用 Mongoose 的惯例。您可以通过将“productIds”字段重命名为“products”来保持简单:
如果您考虑一下,产品数组可以是产品 ID 值的数组,也可以是实际文档。 属性 名称“products”正确适用于所有场景,“productIds”则不然。
考虑到填充的文档在每个文档上也有“_id”属性,没有必要只为 id 值使用新的虚拟属性来膨胀 JSON - 你已经有了它们!
您不太可能在期望文档时获得 id,或者在期望 id 时获得文档,因为您始终知道选择填充 属性 和何时不填充的时间。示例:如果您正在与 API 端点通话,则该 API 端点将始终 return 填充或未填充的产品,而不是随机的。然后,您的前端将根据它进行编码!
该方法是正确的,您应该会在产品字段中看到您的数据。确保你有正确的数据和模型 n
有一种方法可以做到这一点 - 它称为虚拟(请参阅 docs)。
这个想法是创建一个“虚拟属性”,它实际上并没有保存到数据库中,而是作为一个计算出来的属性。根据相关 github 问题上的示例 provided by qinshenxue:
// declare your ID field as a regular string
var countrySchema = new mongoose.Schema({
capitalId: {type:String}
});
// create a virtual field which links between the field you've just declared
// and the related collection.
// localField is the name of the connecting field,
// foreign field is a corresponding field in the connected collection
// justOne says that it'll populate a single connected object,
// set it to false if you need to get an array
countrySchema.virtual('capital',{
ref: 'City',
localField: 'capitalId',
foreignField: '_id',
justOne: true
});
// tell Mongoose to retreive the virtual fields
countrySchema.set('toObject', { virtuals: true });
countrySchema.set('toJSON', { virtuals: true });
// now you can populate your virtual field like it actually exists
// the following will return a Country object in the 'capital' field
Country.find().populate('capital')
我正在使用 mongoose 将 id 字段与各自的文档一起填充到新的 field.my 问题是假设我的购物车模型是 -
let CartSchema = new mongoose.Schema({
userId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
productIds: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Product'
}
]
});
我想填充产品所以我使用了
Cart.find({}).populate("products").exec(function (err, cart) {
console.log(cart)
}
但这会在相同的字段名称 productIds 中填充文档,我想在一个名为 "products" 的新字段名称中填充这些字段,所以我尝试了这个
let CartSchema = new mongoose.Schema({
userId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
productIds: [
{
type: String
}
]
}, { toJSON: { virtuals: true } });
CartSchema.virtual('products', {
ref: 'Product',
localField: 'productIds',
foreignField: '_id',
});
Cart.find({}).populate("products").exec(function (err, cart) {
console.log(cart)
}
但返回了名为 products.so 的空数组,我如何将 productIds 数组填充到新的字段名称 products 及其各自的文档数组。
谢谢。
在技术上做您想做的事情违反了使用 Mongoose 的惯例。您可以通过将“productIds”字段重命名为“products”来保持简单:
如果您考虑一下,产品数组可以是产品 ID 值的数组,也可以是实际文档。 属性 名称“products”正确适用于所有场景,“productIds”则不然。
考虑到填充的文档在每个文档上也有“_id”属性,没有必要只为 id 值使用新的虚拟属性来膨胀 JSON - 你已经有了它们!
您不太可能在期望文档时获得 id,或者在期望 id 时获得文档,因为您始终知道选择填充 属性 和何时不填充的时间。示例:如果您正在与 API 端点通话,则该 API 端点将始终 return 填充或未填充的产品,而不是随机的。然后,您的前端将根据它进行编码!
该方法是正确的,您应该会在产品字段中看到您的数据。确保你有正确的数据和模型 n
有一种方法可以做到这一点 - 它称为虚拟(请参阅 docs)。 这个想法是创建一个“虚拟属性”,它实际上并没有保存到数据库中,而是作为一个计算出来的属性。根据相关 github 问题上的示例 provided by qinshenxue:
// declare your ID field as a regular string
var countrySchema = new mongoose.Schema({
capitalId: {type:String}
});
// create a virtual field which links between the field you've just declared
// and the related collection.
// localField is the name of the connecting field,
// foreign field is a corresponding field in the connected collection
// justOne says that it'll populate a single connected object,
// set it to false if you need to get an array
countrySchema.virtual('capital',{
ref: 'City',
localField: 'capitalId',
foreignField: '_id',
justOne: true
});
// tell Mongoose to retreive the virtual fields
countrySchema.set('toObject', { virtuals: true });
countrySchema.set('toJSON', { virtuals: true });
// now you can populate your virtual field like it actually exists
// the following will return a Country object in the 'capital' field
Country.find().populate('capital')