在mongodb中使用聚合从两个集合检索数据时出现问题
我正在苦苦思索一个我不知道如何执行的问题。。。我有两个收藏 Tarifas系列在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
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