解析一个难的 MongoDB 字段(带有多级数组)

Posted

技术标签:

【中文标题】解析一个难的 MongoDB 字段(带有多级数组)【英文标题】:Parsing a difficult MongoDB field (with multi-level array) 【发布时间】:2021-12-26 01:32:13 【问题描述】:

专家您好

我正在尝试解析一个 MongoDB 集合行,在使用 $unwind 之后, 其余字段之一如下所示:

[
    
        "account_id": "1234",
        "cities": 
            "cityname1": 
                "param1": 1,
                "param2": 2
            
        
    ,
    
        "account_id": "2345",
        "cities": 
            "cityname2": 
                "param1": 3,
                "param2": 3
            
        
    ,
    
        "account_id": "3456",
        "cities": 
            "cityname3": 
                "param1": 8,
                "param2": 6
            
        
    
]

现在,我想继续解析这个字段,所以我可以提取account_idparam1param2 的字段名/值,希望能总结出param1param2价值观。 但是,当我尝试使用第二个 $unwind 时,我收到了那些值为“null”的字段。

我应该如何正确解析这个字段?

【问题讨论】:

“解析”是什么意思? 我的意思是成功提取每个字段的值,然后用它们进行聚合(比如求和)... 【参考方案1】: $set 使用 $objectToArray 将城市更改为数组 $unwind展开城市数组 $group 按 account_id 和 cityname 分组,然后总结 param1 和 param2 (您只能按 account_id 或 cityname 分组,只需删除其中一个)

聚合

db.collection.aggregate([
  
    "$set": 
      cities: 
        "$objectToArray": "$cities"
      
    
  ,
  
    "$unwind": "$cities"
  ,
  
    "$group": 
      "_id": 
        account_id: "$account_id",
        "cityname": "$cities.k"
      ,
      "sumOfParam1": 
        "$sum": "$cities.v.param1"
      ,
      "sumOfParam2": 
        "$sum": "$cities.v.param2"
      
    
  
])

mongoplayground

【讨论】:

亲:使用“set”来排列数据以在之后展开它 = 一个好主意,mongoplayground 也会对我有很大帮助。缺点:由于某种原因,摘要不起作用,我可能需要稍微摆弄一下。如果 24 小时内没有更好的答案,我会选择此答案作为最有帮助的答案

以上是关于解析一个难的 MongoDB 字段(带有多级数组)的主要内容,如果未能解决你的问题,请参考以下文章

带有日期字段的mongodb查询嵌套数组

在 Mongoose/MongoDB 的文档中过滤数组、子文档、数组、文档

MongoDB如何将数组中的字段类型从字符串更改为数组并保持原始值

带有多级解析器/子解析器的 Argparse 可选参数

MongoDB:带有数组的文本索引,只有第一个词被索引

将带有引用的关联数组作为值保存在教义-mongodb中