我有以下项目:
{
'$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。应用程序也是如此。
您可以编写一个条件来检查字段是否丢失。这篇文章展示了一种检查它的方法,如果不存在则会投影一个空对象
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
}
}
}
}
])