【问题标题】:Adding a field in my mongo query using $cond operator使用 $cond 运算符在我的 mongo 查询中添加一个字段
【发布时间】:2021-06-12 13:39:07
【问题描述】:

我有一个文档集合,其中一些文档已归档 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 聚合中添加一个新字段,以便我可以使用 atdetd 两个字段中的任何一个在 voyage_details 部分中。

【问题讨论】:

  • 您使用的是哪个 MongoDB 版本?
  • 我认为它低于版本 4,大约在 3.4 或 3.6 左右
  • 您要更新数据库中的现有文档吗?
  • 不,我不想更新它们

标签: mongodb mongodb-query aggregation-framework pymongo pymongo-3.x


【解决方案1】:

试试这个:

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"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多