将Mongoose对象从id填充到新字段

gblwokeq  于 2023-10-19  发布在  Go
关注(0)|答案(3)|浏览(94)

我正在与 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数组到一个新的字段名称产品与各自的文档数组.
谢谢.

3hvapo4f

3hvapo4f1#

有一种方法可以做到这一点-它被称为虚拟(见文档)。这个想法是创建一个“虚拟财产”,它实际上并没有保存到数据库中,而是作为一个计算财产。根据qinshenxue在相关github问题上提供的示例:

// 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 City object in the 'capital' field
Country.find().populate('capital')
ehxuflar

ehxuflar2#

该方法是正确的,您应该看到您的数据在产品领域。确保你有正确的数据和模型n

ivqmmu1c

ivqmmu1c3#

做你想做的事情在技术上违背了使用Mongoose的惯例。您可以通过将“productIds”字段重命名为“products”来保持简单:
仔细想想,产品数组可以是产品id值的数组,也可以是实际的文档。属性名称“products”适用于所有场景,但“productIds”不适用。
考虑到填充的文档在每个文档上都有“_id”属性,没有必要仅仅为id值使用新的虚拟属性来膨胀JSON-您已经有了它们!
当期望文档时,你不太可能得到id,或者当期望id时,你不太可能得到文档,因为你总是知道你选择什么时候填充属性,什么时候不填充。示例:如果您正在与一个API端点对话,则该API端点将始终返回已填充或未填充的产品,而不是随机返回两者。然后,您的前端将针对此进行编码!

相关问题