我有两个收藏:共享和材料。
分享:
{
from_id: 2
to_id: 1
material_id: material1
}
材料:
{
_id: material1
organization_id: 2
},
{
_id: material2
organization_id: 1
},
{
_id: material3
organization_id: 1
},
--编辑:有三个物料,2属于organization_id(1),1属于organization_id(2)。organization_id与材料1中的1不匹配(而是属于材料2),但在共享集合中,to_id匹配1。如果匹配存在,我想找到材料文档_id它等于共享的material_id,并找到organization_id等于1的材料文档。
我想检查共享(to_id)中的字段是否具有等于材料(organization_id)中的字段的值,并检查organization_id是否等于1。如果存在由此产生的文档,请再次检查材料的_id是否等于共享的material_id并返回所有文档
如果没有相等的值,我想省略该结果,发送只有organization_id等于1的对象,并获得该结果的总计数。
现在,我使用. map()以一种非常低效的方式来查找它。下面是我的代码:
export const getMaterials = async (req, res) => {
const sharing = await Sharing.find({to_id: 1});
let doneLoad;
try {
if (sharing && sharing.length>0) {
const sharingTotal = await Material.find( {$or: [ {organization_id: 1}, {_id: sharing.map((item) => item.material_id)} ] } ).countDocuments();
const sharingMats = await Material.find( {$or: [ {organization_id: 1}, {_id: sharing.map((item) => item.material_id)} ] } );
res.status(200).json({data: sharingMats});
doneLoad= true;
}
else if (!doneLoad) {
const materialTotal = await Material.find({organization_id: 1}).countDocuments();
const materials = await Material.find({organization_id: 1});
res.status(200).json({data: materials});
}
} catch (error) {
res.status(404).json({ message: error.message });
}
}
我已经尝试过使用聚合来获得我想要的结果,但是我找不到任何符合我要求的解决方案。任何帮助都会很好,因为我对使用mongoDB很陌生。谢谢。
编辑(所需结果):
Materials: [
{
_id: material1,
organization_id: 1
},
{
_id: material2,
organization_id: 1
},
{
_id: material3,
organization_id: 1
}
]
您可以在$lookup
中使用子管道来执行过滤。$addFields
稍后使用$size
进行计数。
db.Sharing.aggregate([
{
"$match": {
to_id: 1
}
},
{
"$lookup": {
"from": "Material",
"let": {
to_id: "$to_id",
material_id: "$material_id"
},
"pipeline": [
{
"$match": {
$expr: {
$or: [
{
$eq: [
"$$to_id",
"$organization_id"
]
},
{
$eq: [
"$$material_id",
"$_id"
]
}
]
}
}
},
{
"$addFields": {
"organization_id": 1
}
}
],
"as": "materialLookup"
}
},
{
"$addFields": {
"materialCount": {
$size: "$materialLookup"
}
}
}
])
这里是蒙哥游乐场供大家参考。