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

Posted

技术标签:

【中文标题】使用 $cond 运算符在我的 mongo 查询中添加一个字段【英文标题】:Adding a field in my mongo query using $cond operator 【发布时间】: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 左右 您要更新数据库中的现有文档吗? 不,我不想更新它们 【参考方案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"

【讨论】:

以上是关于使用 $cond 运算符在我的 mongo 查询中添加一个字段的主要内容,如果未能解决你的问题,请参考以下文章

Mongo 查询未在我的主服务器中产生结果

我如何使用like运算符在mongo db中查询[重复]

Mongo / Mongoose 聚合 - $redact 和 $cond 问题

使用多个 mongo 查询填充数组 [重复]

使用多个 mongo 查询填充数组 [重复]

聚合框架中的 rmongodb $cond