首页 > 解决方案 > Mongo $filter 条目在聚合 $addFields 中具有定义的字段

问题描述

我想获取数组的计数,其中每个项目都有某个字段的值。到目前为止,我已经尝试了不同的运算符,例如$ne$ifNull但它们不起作用。

这里的代码示例:

{
  $addFields: {
    definedItemsCount: {
      $size: {
        $filter: {
          input: '$itemList',
          as: 'item',
          cond: {
            $ne: ['$$item.definedField', null],
          },
        },
      }
    },
  },
},

这是我的文件item

{
  title: String,
  definedField: ObjectId
}

我只需要过滤分配了值的项目definedField

所以整个文档看起来像这样,我需要在其中获取被分配的计数itemsdefinedField不是 null。我得到$ne计数​​ 2 而不是 1

[
  {
    "title": "Title text",
    "items": [
      {
        "title": "some title"
        "definedField": "5ff479fa3dd9d33fc8e3125f",
      },
      {
        "title": "some title"
      }
    ],
    "definedCount": 2,
    "id": "600e081854d922517ccc919e",
    "date": "2021-01-24T23:51:52.820Z",
  }
]

注意我不能使用$match,因为数组items是父母文档的字段

标签: javascriptnode.jsmongodbfilterschema

解决方案


尝试$type来检查字段的数据类型,如果集合中有对象 id 则尝试类型等于类型objectId的替代objectId为 7,

  {
    $addFields: {
      definedItemsCount: {
        $size: {
          $filter: {
            input: "$items",
            as: "item",
            cond: { $eq: [{ $type: "$$item.definedField" }, "objectId"] }
          }
        }
      }
    }
  }

操场


推荐阅读