提问者:小点点

如何仅当文档在MongoDB中具有特定字段时才投影对象?


我有以下项目:

{
    '$project': {
        '_id': 1,
        'applicationIds': {
            'type': 'linux',
            'refId': '$applicationIds'
        },
        'configurationIds': {
            'type': 'linux',
            'refId': '$configurationIds'
        }
    }
}

只要$配置ID中至少有一条记录,我就会得到这样的结果:

{
    'type': 'linux',
    'refId': ObjectId('...')
}

$application ationIds相同…

$配置Ids$application ationIds中没有记录时,就会出现问题,然后我得到这个:

{
    'type': 'linux'
}

我不想这样,如果没有$application ationIds,我只希望对象为空。

顺便说一句,在这个阶段之前,我在$application ationIds上做了一个$unwinder(使用保留空和空数组),所以每个文档中只能有一个或没有application ationIds。应用程序也是如此。


共2个答案

匿名用户

您可以编写一个条件来检查字段是否丢失。这篇文章展示了一种检查它的方法,如果不存在则会投影一个空对象

db.collection.aggregate([
  {
    $project: {
      _id: 1,
      applicationIds: {
        $cond: {
          if: { $ne: [ { $type: "$applicationIds" }, "missing" ] },
          then: { type: "linux", refId: "$applicationIds" },
          else: {}
        }
      },
      configurationIds: {
        $cond: {
          if: { $ne: [ { $type: "$configurationIds" }, "missing" ] },
          then: { type: "linux", refId: "$configurationIds" },
          else: {}
        }
      }
    }
  }
])

操场

如果您不想在投影后也使用不存在的字段来代替空对象,您可以使用$$REMOVE。这篇文章有一些示例用法

db.collection.aggregate([
  {
    $project: {
      _id: 1,
      applicationIds: {
        $cond: {
          if: { $ne: [ { $type: "$applicationIds" }, "missing" ] },
          then: { type: "linux", refId: "$applicationIds" },
          else: "$$REMOVE"
        }
      },
      configurationIds: {
        $cond: {
          if: { $ne: [ { $type: "$configurationIds" }, "missing" ] },
          then: { type: "linux", refId: "$configurationIds" },
          else: "$$REMOVE"
        }
      }
    }
  }
])

操场

匿名用户

db.myCollection.aggregate([
   {
      $project: {
         fieldToProject: {
            $cond: {
               if: { $exists: ["$specificField", true] },
               then: "$specificField",
               else: null
            }
         }
      }
   }
])