在mongodb中使用聚合从两个集合检索数据时出现问题

在mongodb中使用聚合从两个集合检索数据时出现问题,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正在苦苦思索一个我不知道如何执行的问题。。。我有两个收藏 Tarifas系列 tarifaConfig = new Schema({ producto: { type: String }, titulo: { type: String }, bloqueo: { type: Boolean }, margen: { type: Number }, precioVenta: { type: Number }, precioVentaIva: { t

我正在苦苦思索一个我不知道如何执行的问题。。。我有两个收藏

Tarifas系列

tarifaConfig = new Schema({
    producto: { type: String },
    titulo: { type: String },
    bloqueo: { type: Boolean },
    margen: { type: Number },
    precioVenta: { type: Number },
    precioVentaIva: { type: Number },
})

const tarifaSchema = new Schema({
    codigo: { type: String },
    titulo: { type: String },
    margen: { type: Number },
    estado: { type: Boolean },
    bloqueo: { type: Boolean },
    configs: [tarifaConfig]
})
const productosSchema = new Schema({
    ref: { type: String },
    nombre: { type: String },
    precioCompra: { type: Number },
    precioCompraIva: { type: Number },
    precioVenta: { type: Number },
    precioVentaIva: { type: Number },
    iva: { type: Number },
})
产品系列

tarifaConfig = new Schema({
    producto: { type: String },
    titulo: { type: String },
    bloqueo: { type: Boolean },
    margen: { type: Number },
    precioVenta: { type: Number },
    precioVentaIva: { type: Number },
})

const tarifaSchema = new Schema({
    codigo: { type: String },
    titulo: { type: String },
    margen: { type: Number },
    estado: { type: Boolean },
    bloqueo: { type: Boolean },
    configs: [tarifaConfig]
})
const productosSchema = new Schema({
    ref: { type: String },
    nombre: { type: String },
    precioCompra: { type: Number },
    precioCompraIva: { type: Number },
    precioVenta: { type: Number },
    precioVentaIva: { type: Number },
    iva: { type: Number },
})
现在,我使用聚合方法在响应中检索这两个集合

 productosModel.aggregate([
        {
            $match: { _id: ObjectId(req.params.id) }
        },
        {
            $lookup: {
                from: "tarifas",
                as: "tarifas",
                pipeline: []
            }
        }
    ]).then((producto) => {
        res.json(producto);
    })
这是工作,并给我两个集合的回应。。。但是 在tarifa的集合中,我有一个名为“configs”的属性,它是一个包含许多子集合的数组。。。此子集合是我拥有的每个产品的配置, 所以我需要做的是,检索所有具有产品配置的tarifa,如果配置不包含,则检索具有空数组的tarifa

预期结果

{
   ref: 'rbe34',
   nombre: 'bike',
   precioCompra: 10,
   precioCompraIva: 12.1,
   precioVenta: "",
   precioVentaIva: "",
   iva: 21,
   tarifas:[
   { 
    codigo: 'NOR',
    titulo: 'Normal tarifa',
    margen: 33,
    estado: true,
    bloqueo: true,
    configs: [], ///HERE I NEED A EMPTY ARRAY IF THERE IS NOT ANY CONFIG THAT MATCH WITH THE PRODUCT ID,  
   }
   ]
}
我试图在聚合管道中添加$match

   productosModel.aggregate([
        {
            $match: { _id: ObjectId(req.params.id) }
        },
        {
            $lookup: {
                from: "tarifas",
                as: "tarifas",
                pipeline: [
                    { $match: { 'configs.producto': req.params.id } }
                ]
            }
        }
    ])

但是,如果没有任何配置与产品匹配,它就不会检索Tarifa收藏的其余部分

似乎您在检索阵列后试图对其进行
$filter

此管道将仅返回配置中的
producto
字段与产品中的
ref
字段相匹配的配置

    [
        {
            $match: { _id: ObjectId(req.params.id) }
        },
        {
            $lookup: {
                from: "tarifas",
                as: "tarifas",
                pipeline: [
                  {
                    $addFields: {
                         "tarifas.configs":{ $filter:{
                                               input: "$tarifas.configs",
                                                cond: {$eq:["$$this.producto","$ref"]}
                           } }
                       } 
                   }
               ]
            }
        },

    ]

$eq
数组中的字段更改为您需要匹配的字段。

您能发布示例数据吗result@Valijon该死,对不起,如果我没有解释清楚,你如何确定特定配置是否与产品匹配?我想你真的很接近。。。但是我正在做$$this.producto,这是我在tarifas.config数组中查找的字段,我正在为我想要筛选的数据更改$ref。。。但不是在数组中检索我的配置。。。它正在使用tarifas Agreegation检索,但tarifas.config为空。。。我正在检查集合,有一个与之匹配的寄存器:SI尝试了很多方法来找到问题,似乎在$filter:{input:$tarifas.configs,}中的过滤效果不好,因为我尝试了像$filter:{input:$tarifas',cond:{$eq:['$$this.\u id,id]这样的高级过滤它正在正确地过滤…那么为什么它输入:“$tarifas.configs”没有过滤…可能是因为configs是一个数组?…dunnook解决了它,只是在管道中添加了$addFields,它就开始工作了…感谢老兄,我学到了很多关于聚合功能的知识;:D