MongoDB:仅投影特定类型的字段

问题描述

MongoDB中是否可以投影具有特定类型的文档的所有字段?

例如,如果我有以下文档:

{
  _id: 5dde4c55c6c36b3bb4f5ad30,name: "Peter",age: 45,division: "marketing"
}

我想说:仅返回类型string的字段。这样,我最终会得到:

{
  _id: 5dde4c55c6c36b3bb4f5ad30,division: "marketing"
}

解决方法

您可以使用$type检查字段的类型,

  • $reduce使用$$ROOT输入$objectToArray对象作为数组
  • 检查条件,如果字段值类型为string,则将其与initialValue连接并返回
  • 返回值将是数组,我们需要使用$arrayToObject
  • 将其转换为数组
  • $replaceWith将根替换为新返回的对象
db.collection.aggregate([
  {
    $replaceWith: {
      $arrayToObject: {
        $reduce: {
          input: { $objectToArray: "$$ROOT" },initialValue: [],in: {
            $concatArrays: [
              "$$value",{
                $cond: [
                  { $eq: [{ $type: "$$this.v" },"string"] },["$$this"],[]
                ]
              }
            ]
          }
        }
      }
    }
  }
])

Playground