首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当并非所有的字段都有值时,联接字段

当并非所有的字段都有值时,联接字段
EN

Stack Overflow用户
提问于 2018-11-25 21:49:54
回答 1查看 2.1K关注 0票数 3

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

如果字段为空或为空,则不会将其添加到协连字符串中。

代码语言:javascript
复制
{$project:{

//trial-1:
finalField:{
 $concat["$field1",'-','$field2','-','$field3',...] 
//problem1: $concat will return null if any of it's arguments is null or missing
//problem2: if all the fields are exist with non-null values, the delimiter will exists even if the field dosen't 
}


//trial-2:
finalField:{
 $concat:[
  {$cond:[{field1:null},'',{$concat:['$field1','-']},..]
//the problem: {field1:null} fails if the field dosen't exixt (i.e the expression gives true)

//trial-3
finalField:{
 $concat:[
  {$cond:[{$or:[{field1:null},{field:{$exists:true}},'',
   {$concat:['$field1','-']}
]}]}
]
}

] 
}

//trial-4 -> using $reduce instead of $concate (same issues)

}

EN

回答 1

Stack Overflow用户

发布于 2018-11-25 21:56:41

你基本上想要$ifNull。它与$exists类似,但对于聚合语句,当字段表达式返回null时,它返回一个默认值,意思是“不在那里”:

代码语言:javascript
复制
{ "$project": {
  "finalField": {
    "$concat": [
      { "$ifNull": [ "$field1", "" ] },
      "-",
      { "$ifNull": [ "$field2", "" ] },
      "-",
      { "$ifNull": [ "$field3", "" ] }
    ]
  }
}}

例如,对于数据,如:

代码语言:javascript
复制
{ "field1": "a", "field2": "b", "field3": "c" },
{ "field1": "a", "field2": "b" },
{ "field1": "a", "field3": "c" }

当然,没有任何错误产生:

代码语言:javascript
复制
{ "finalField" : "a-b-c" }
{ "finalField" : "a-b-" }
{ "finalField" : "a--c" }

如果您想要更漂亮的东西,那么可以动态地使用名称,如下所示:

代码语言:javascript
复制
  { "$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" ] }
          }
        }
      }
    }
  }}

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

代码语言:javascript
复制
{ "finalField" : "a-b-c" }
{ "finalField" : "a-b" }
{ "finalField" : "a-c" }

如果不希望文档或子文档上的$objectToArray,甚至可以手动指定字段列表:

代码语言:javascript
复制
  { "$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" ] }
          }
        }
      }
    }
  }}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53472337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档