【问题标题】:MongoDb return records only if $lookup cond is occurMongoDb 仅在 $lookup cond 发生时才返回记录
【发布时间】:2021-11-01 23:55:52
【问题描述】:

我有一个具有字段 ref 的类模型。

我正在尝试仅获取与查找条件匹配的记录。

所以我做了什么:


    {
      $lookup: {
        from: 'fields',
        localField: "field",
        foreignField: "_id",
        as: 'FieldCollege',
      },
    },
    {
      $addFields: {
        "FieldCollege": {
          $arrayElemAt: [
            {
              $filter: {
                input: "$FieldCollege",
                as: "field",
                cond: {
                  $eq: ["$$field.level", req.query.level]
                }
              }
            }, 0
          ]
        }
      }
    },

如果条件匹配,上面的代码可以正常工作并返回FieldCollege

但问题是,我只想在 FieldCollege 不为空的情况下返回课程记录。

我对 mongodb 完全陌生。所以我尝试了这样的事情:

    {
      $match: {
        'FieldCollege': { $exists: true, $ne: [] }

      }
    },

显然这不起作用。

mongodb 是否支持这样的事情,还是我让事情复杂化了?

编辑

以上代码的结果:

    "Classes": [
      {
          "_id": "613245664c6ea614e001fcef",
          "name": "test",
          "language": "en",
          "year_cost": "3232323",
          "FieldCollege":[] // with $unwind
      }
  ],

预期结果:

   "Classes": [
     // FieldCollege is empty 
  ],

【问题讨论】:

  • 您能否发布您的示例数据和预期输出
  • @varman 我更新了我的问题

标签: mongodb express mongoose aggregation-framework


【解决方案1】:

我认为最好的选择是使用带有管道的查找,并查看查询的最终版本,

  • $lookup 带有字段集合并匹配您的两个条件
  • $limit 生成一份文件
  • $matchFieldCollege不为空[]
  • $addElemAt 从结果FieldCollege 中获取第一个元素
[
  {
    $lookup: {
      from: "fields",
      let: { field: "$field" },
      pipeline: [
        {
          $match: {
            $and: [
              { $expr: { $eq: ["$$field", "$_id"] } },
              { level: req.query.level }
            ]
          }
        },
        { $limit: 1 }
      ],
      as: "FieldCollege"
    }
  },
  { $match: { FieldCollege: { $ne: [] } } },
  {
    $addFields: {
      FieldCollege: { $arrayElemAt: ["$FieldCollege", 0] }
    }
  }
]

【讨论】:

    猜你喜欢
    • 2017-08-30
    • 2021-01-07
    • 2017-10-08
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2018-08-27
    • 2019-04-15
    相关资源
    最近更新 更多