当不是全部都有值时联接字段

时间:2018-11-25 21:49:55

标签: mongodb mongodb-query aggregation-framework

我想通过聚合管道中的投影阶段修改字段,该字段是由(-)分隔的其他字段值的组合

如果该字段为空或缺少该字段,则不会将其添加到并置字符串中

BX

}

1 个答案:

答案 0 :(得分:0)

您基本上想要$ifNull。与$exists类似,它是“排序” ,但对于聚合语句,当字段表达式返回null时,它将返回默认值,表示“不存在”:

{ "$project": {
  "finalField": {
    "$concat": [
      { "$ifNull": [ "$field1", "" ] },
      "-",
      { "$ifNull": [ "$field2", "" ] },
      "-",
      { "$ifNull": [ "$field3", "" ] }
    ]
  }
}}

例如,数据如下:

{ "field1": "a", "field2": "b", "field3": "c" },
{ "field1": "a", "field2": "b" },
{ "field1": "a", "field3": "c" }

您可以得到,而不会产生任何错误:

{ "finalField" : "a-b-c" }
{ "finalField" : "a-b-" }
{ "finalField" : "a--c" }

如果您需要更高级的产品,则可以动态地使用名称,例如:

  { "$project": {
    "finalField": {
      "$reduce": {
        "input": {
          "$filter": {
            "input": { "$objectToArray": "$$ROOT" },
            "cond": { "$ne": [ "$$this.k", "_id" ] }
          }
        },
        "initialValue": "",
        "in": { 
          "$cond": {
            "if": { "$eq": [ "$$value", "" ] },
            "then": { "$concat": [ "$$value", "$$this.v" ] },
            "else": { "$concat": [ "$$value", "-", "$$this.v" ] }
          }
        }
      }
    }
  }}

可以知道实际上存在哪些字段,并且仅尝试加入这些字段:

{ "finalField" : "a-b-c" }
{ "finalField" : "a-b" }
{ "finalField" : "a-c" }

如果您不想在文档或子文档上使用$objectToArray,甚至可以手动指定字段列表:

  { "$project": {
    "finalField": {
      "$reduce": {
        "input": {
          "$filter": {
            "input": ["$field1", "$field2", "$field3"],
            "cond": { "$ne": [ "$$this", null ] }
          }
        },
        "initialValue": "",
        "in": { 
          "$cond": {
            "if": { "$eq": [ "$$value", "" ] },
            "then": { "$concat": [ "$$value", "$$this" ] },
            "else": { "$concat": [ "$$value", "-", "$$this" ] }
          }
        }
      }
    }
  }}