繁体   English   中英

如何使用 mongodb 聚合删除具有空字符串值的数组嵌套对象的字段?

[英]How to remove a field of an array's nested object that has an empty string value using mongodb aggregation?

到目前为止,在我尝试之后,我想出了解决方案,如果该对象具有空值字段,我可以删除数组内的整个对象。 这在我的情况下不起作用。 我只需要删除字段并保留对象的其余部分。 在这种情况下,“评论”字段是偶尔具有空值的字段。 提前致谢!

结构:

someArray [
{
  field1:"value",
  field2:"value",
  Comment:""},
{
  field1:"value",
  field2:"value",
  Comment:""}]

代码:

    $project: {
      someArray: {
        $filter: {
          input: "$someArray", as: "array",
          cond: { $ne: [ "$$array.Comment", ""]}}}}

使用$map遍历数组元素。对于每个comment不是空字符串的数组元素,返回整个元素,否则返回不包括注释字段的文档。 像这样:

db.collection.aggregate([
  {
    "$project": {
      someArray: {
        $map: {
          input: "$someArray",
          as: "element",
          in: {
            $cond: {
              if: {
                $eq: [
                  "",
                  "$$element.Comment"
                ]
              },
              then: {
                field1: "$$element.field1",
                field2: "$$element.field2"
              },
              else: "$$element"
            }
          }
        }
      }
    }
  },
  
])

这里是工作链接

这是一个解决方案,其中数组的嵌套对象可以有多个字段,并且这些字段不需要在聚合中引用。 删除嵌套对象的字段,其值为空字符串 ( "" ):

db.collection.aggregate([
{ 
  $set: { 
      someArray: { 
          $map: { 
              input: '$someArray', 
              as: 'e',
              in: {
                  $let: {
                      vars: {
                          temp_var: { 
                              $filter: { 
                                  input: { $objectToArray: '$$e' }, 
                                  cond: { $ne: [ '', '$$this.v' ] }, 
                              }
                           }
                      },
                      in: {
                          $arrayToObject: '$$temp_var'
                      }
                  }
              }
          }
      }
   }
},
])

Charchit Kapoor 的解决方案仅在您的阵列完全具有

{
  field1: ...
  field2: ...
  Comment:""
}

但它不适用于任意字段。 我正在寻找更通用的解决方案,我的第一个想法是:

db.collection.aggregate([
   {
      "$project": {
         someArray: {
            $map: {
               input: "$someArray",
               in: {
                  $cond: {
                     if: { $eq: ["$$this.Comment", ""] },
                     then: { $mergeObjects: ["$$this", { Comment: "$$REMOVE" }] },
                     else: "$$this"
                  }
               }
            }
         }
      }
   }
])

但它不起作用。

我结束了这个:

db.collection.aggregate([
   {
      "$project": {
         someArray: {
            $map: {
               input: "$someArray",
               in: {
                  $cond: {
                     if: { $eq: ["", "$$this.Comment"] },
                     then: {
                        $arrayToObject: {
                           $filter: {
                              input: {
                                 $map: {
                                    input: { $objectToArray: "$$this" },
                                    as: "element",
                                    in: { $cond: [{ $eq: ["$$element.k", "Comment"] }, null, "$$element"] }
                                 }
                              },
                              as: "filter",
                              cond: "$$filter" // removes null's from array 
                           }
                        }
                     },
                     else: "$$this"
                  }
               }
            }
         }
      }
   }
])

蒙戈游乐场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM