首页 > 解决方案 > 有没有一种方法可以比 .populate() 更有效地验证 mongoose 中的相关文档并将其聚合在一起

问题描述

鉴于这些模型:

产品:

const productSchema = new Schema({
    name: String,
    description: String,
    price: Number,
    steps: [{
        type: Schema.Types.ObjectId,
        ref: 'steps'
    }]
});

脚步:

const stepSchema = new Schema({
    name: String,
    minimum: Number,
    maximum: Number,
    items: [
        {
            name: String,
            price: Number
        }
    ]
});

有没有更好的方法来查询具有 N 个产品的对象,而不是选择所有 products.steps 而不使用 .populate() (因为它会请求 products.steps 数组中的每个值)和一个 for 循环将 productSchema 和 stepSchema 中包含的所有价格相加?

使用示例:

在我的文件中,我有这样的产品集合:

[{
    id: 1
    name: Pizza,
    description: "Medium (3 flavors)",
    price: 10,
    steps: [{
        "1",
        "2"

    }]
},
{
    id: 2
    name: Pizza,
    description: "small (1 flavors)",
    price: 10,
    steps: [{
        "1",

    }]
}]

步骤如下:

[{
    id: 1
    name: "Flavor",
    minimum: 0,
    maximum: 1,
    items: [
        {
            id: 1
            name: "mozzarella",
            price: 4
        },
        {
            id: 2
            name: "pepperoni",
            price: 5
        }
    ]
},
{
    id: 2
    name: "Border",
    minimum: 0,
    maximum: 0,
    items: [
        {
            id: 3
            name: "With normal cheese",
            price: 0
        },
        {
            id: 4
            name: "With special cheese",
            price: 3
        }
    ]
}]

那么有没有更好的方法来验证我的 BD 中这样的对象,而查询更少且没有 for 循环?

products: [
    {
        productId: 1,
        price: 30,
        quantity: 3,
        steps: [{
            stepId: 1
            items: [
                {
                    itemId: 1,
                    price: 4
                },
                {
                    itemId: 2,
                    price: 5
                }
            ]
        }]

    }
]

标签: node.jsmongooseaggregation-frameworkmongoose-schema

解决方案


我认为应该遵循以下步骤:

  1. $lookup(聚合)或填充
  2. $项目(聚合)

推荐阅读