使用 $cond 运算符在我的 mongo 查询中添加一个字段

Adding a field in my mongo query using $cond operator

我有一个文档集合,其中一些文档已归档 atd,而其他文档在嵌套字段 voyage_details 中有 etd,例如:

[
  {
    "_id" : ObjectId("..."),
    "voyage_details" : {
      "atd" : "15-Mar-21"
    }
  },
  {
    "_id" : ObjectId("..."),
    "voyage_details" : {
      "etd" : "15-Mar-21"
    }
  }
]

现在,我想编写一个 mongo 聚合查询,在其中我根据条件创建一个新字段,如果文档中包含键 atd,那么我想添加该新字段中键 atd 的值,如果文档中不存在该键,则在该新字段中添加键 etd 的值。

我已经编写了这样的聚合查询,以在 atdetd 的基础上添加一个新字段,无论两者中哪个都存在于 voyage_details 对象中:

{
  "$addFields": {
    "sailing_date": {
      "$cond": {
        "if": { "voyage_details.atd": { "$exists": True } },
        "then": "$voyage_details.atd",
          "else": "$voyage_details.etd"
      }
    }
  }
}

任何人都可以指导我编写正确的查询以在我的 mongo 聚合中添加一个新字段,以便我可以使用 atd etd voyage_details 部分中出现的两个字段中的任何一个。

试试这个:

db.collection.aggregate([
    {
        "$addFields": {
            "sailing_date": {
                "$ifNull": ["$voyage_details.atd", "$voyage_details.etd"]
            }
        }
    }
]);

输出:

/* 1 createdAt:3/15/2021, 3:36:19 PM*/
{
    "_id" : ObjectId("604f319b9ee8b82dd8cd9f3f"),
    "voyage_details" : {
        "atd" : "15-Mar-21"
    },
    "sailing_date" : "15-Mar-21"
},

/* 2 createdAt:3/15/2021, 3:36:19 PM*/
{
    "_id" : ObjectId("604f319b9ee8b82dd8cd9f40"),
    "voyage_details" : {
        "etd" : "15-Mar-21"
    },
    "sailing_date" : "15-Mar-21"
}