提问者:小点点

MongoDB从另一个集合中的字段查找集合中的文档


我有两个收藏:共享和材料。

分享:

{
 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
}
]

共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"
      }
    }
  }
])

这里是蒙哥游乐场供大家参考。