【问题标题】:Combine array in MongoDB在 MongoDB 中组合数组
【发布时间】:2020-03-12 17:22:28
【问题描述】:

嗨,这是我的代码,只是不知道该怎么做

db.car3.aggregate([{$group:{_id:"$Manufacturer",Extras:{$push:"$Extras"}}}]) 

我得到的结果是

{_ID:"Fiat","Extra:[[Aircon,parking,GPS],[GPS,Parking Sensor, Pass]]"},
{_ID:"Toyota","Extra:[[ABS,Power Windows,GPS],[GPS,Auto Wiper, Pass]]"}

我不确定如何将这些数组组合在一起,所以最后就是这个

{_ID:"Fiat","Extra:[[Aircon,parking,GPS,Parking Sensor, Pass]]"},    
{_ID:"Toyota","Extra:[ABS,Power Windows,GPS,Auto Wiper, Pass]"}

【问题讨论】:

  • 你喜欢获取数组还是嵌套数组?我怀疑结果来自上面的代码(ExtrasExtra 不匹配,它不是有效的 BSON)
  • { $push: { : , ... } }

标签: arrays mongodb mongodb-query array-merge


【解决方案1】:

您使用$reduce 运算符将数组中的每个元素组合成一个值(在这种情况下,将多个数组组合成一个数组)。

只需将此阶段添加到您的聚合中 $group 阶段之后:

{ 
  $addFields: { 
      Extra: { 
          $reduce: { 
               input: "$Extra", 
               initialValue: [ ], 
               in: { $concatArrays : [ "$$value", "$$this" ]  } 
          }
      }
  }
}

【讨论】:

  • $$value$$this 是在 $reduce 构造中使用的特殊变量。 $$value 指的是值被累积(或减少)到单个数组,它在initialValue 处初始化。 $$this 指的是数组的当前元素。 reduce 函数遍历数组(在本例中为$Extra)并将元素累积到单个数组中——这就是您在结果中看到的内容。我认为这是预期的结果。有关详细信息,请参阅$reduce 的文档。
【解决方案2】:

好像$extra 已经是一个数组了。所以,在$group 之前使用$unwind

另外,使用$addToSet 代替$push 以保持数组中的字段唯一。

更新后的查询将如下所示:

db.car3.aggregate([
    {
        $unwind:"$Extras"
    },
    {
        $group:{
            _id:"$Manufacturer",
            Extras:{
                $addToSet:"$Extras"
            }
        }
    }
]).pretty()

因此,此后不需要进一步合并。

输出将是:

{_ID:"Fiat","Extra:[[Aircon,parking,GPS,Parking Sensor, Pass]]"},    
{_ID:"Toyota","Extra:[ABS,Power Windows,GPS,Auto Wiper, Pass]"}

【讨论】:

    猜你喜欢
    • 2021-11-20
    • 2019-09-28
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    相关资源
    最近更新 更多