【问题标题】:Convert multiple array into one array in MongoDB, also remove the None values from Arrays在 MongoDB 中将多个数组转换为一个数组,同时从数组中删除 None 值
【发布时间】:2021-02-21 03:30:54
【问题描述】:

Mongo DB 数组结构:

{

    "time" :[
           [2018-12-18T20:16:28.800Z , 2018-12-18T20:16:28.800Z, 2016-11-14T10:16:32.700Z],
           [2016-11-14T10:16:32.700Z, 2017-09-17T11:16:54.500Z, 2018-12-18T20:16:28.800Z],
           [2017-09-17T11:16:54.500Z, 2018-12-18T20:16:28.800Z, 2016-11-14T10:16:32.700Z]
],
    "bar": [
           [2,5,9,8],
           [6,3,7,None],
           [7,8,None]
    ]
}

一个没有 None 值的数组的预期输出:

"time" :[
2018-12-18T20:16:28.800Z, 
2018-12-18T20:16:28.800Z, 
2016-11-14T10:16:32.700Z,
2016-11-14T10:16:32.700Z, 
2017-09-17T11:16:54.500Z, 
2017-09-17T11:16:54.500Z, 
2016-11-14T10:16:32.700Z
],
    "bar": [
           2,
           5,
           9,
           6,
           3,
           7,
           8
]
}

我正在使用 Mongodb 4.2,并且想将多个数组转换为一个数组,没有$unwind。因为它会降低我的性能。

【问题讨论】:

    标签: mongodb mongoose multidimensional-array mongodb-query aggregation-framework


    【解决方案1】:

    你可以试试,

    • 时间,$reduce 迭代时间循环,$concatArrays 合并数组
    • bar,$reduce 用于迭代 bar 循环,$concatArrays 用于合并数组并获得唯一值,$filter 用于从 $reduce 迭代更新数组的循环并从该数组中删除 None 值李>
    db.collection.aggregate([
      {
        $project: {
          time: {
            $reduce: {
              input: "$time",
              initialValue: [],
              in: { $concatArrays: ["$$value", "$$this"] }
            }
          },
          bar: {
            $filter: {
              input: {
                $reduce: {
                  input: "$bar",
                  initialValue: [],
                  in: { $concatArrays: ["$$value", "$$this"] }
                }
              },
              cond: { $ne: ["$$this", "None"] }
            }
          }
        }
      }
    ])
    

    Playground

    【讨论】:

    • 感谢您的回答,但在这种情况下,我没有得到重复值,bar 包含数组内的多个重复值。只想排除“无”
    • 好的,我看了你的预期,这是独一无二的,这就是我使用 $setUninon 的原因。
    • 谢谢,它对我有用。我得到了多个文件。我怎么能做一个?文档1:{_id:abcdef,名称:“foo”,时间:[1234],文档:[1234]}文档2{_id:alexa,名称:“alexa”,时间:[1234] , doc: [1234] } 预期输出 { time[1234], alexa[1234], foo[1234] }
    • 您的意思是您需要将所有文档合并为一个?只需与您的数据共享一个游乐场链接。
    • playground。是的,我想将所有文档合并为单个文档。
    猜你喜欢
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2013-02-19
    • 2019-01-27
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    相关资源
    最近更新 更多