MongoDB使用对象数组聚合对象?

时间:2015-01-31 19:30:15

标签: mongodb aggregation-framework

以下是json中我的收藏的一部分:

[{"company":"Lenovo", "models": 
    [{"model":"ThinkPad T400", "gens": 
        [{"gen":"3", "start":2012},
        {"gen":"2", "start":2008},
        {"gen":"1", "start":2004}]
    }...]
}...]

我正在尝试使用一个聚合命令来返回以下内容:

[{ "_id":"Lenovo", 
  "models":[{ "model": "ThinkPad T400", 
              "gens":["1","2","3"]
            }...]
}...]

我尝试了以下聚合命令,但它没有工作:

db.makes.aggregate([{
    $group:{
        _id: '$company',
        models: { $push:  { 
            model: "$models.model", 
            gen: "$models.gens.gen"
        }} 
    } 
}])

我得到了这个结果:

[{ "_id":"Lenovo", 
  "models":[{ "model": ["ThinkPad T400"], 
              "gens":[ ["1","2","3"] ]
            }...]
}...]

可能是因为我的每个对象都有一个对象数组(模型),而且这些对象也有一个对象数组(Gens)。

对MongoDB的正确请求会给我什么结果?

3 个答案:

答案 0 :(得分:4)

尝试此查询:

db.makes.aggregate([
{$unwind : '$models'},
{
    $group:{
        _id: '$company',
        models: { $push:  { 
            model: "$models.model", 
            gen: "$models.gens.gen"
        }} 
    }
}])

输出将是

{
    "_id" : "Lenovo",
    "models" : [ 
        {
            "model" : "ThinkPad T400",
            "gen" : [ 
                "3", 
                "2", 
                "1"
            ]
        }
    ]
}

答案 1 :(得分:3)

我可能在这里遗漏了一些东西,但在我看来,你的原始数据非常类似于你想要得到的东西。是否有多个文档的company设置为Lenovo

如果没有,你可以用一个更简单的命令得到你想要的东西:

db.makes.find({}, {_id: 0, company: 1, "models.model": 1, "models.gens.gen": 1 });

这不是您正在寻找的结果:

{
  "company": "Lenovo",
  "models": [
    {
      "model": "ThinkPad T400",
      "gens": [
        {
          "gen": 3
        },
        {
          "gen": 2
        },
        {
          "gen": 1
        }
      ]
    }
  ]
}

它只有在company字段已经是唯一的情况下才有效,但是MongoDB提供的方式会更容易,因为您不必使用聚合框架,也不需要解开任何问题。潜在的长阵列。

答案 2 :(得分:0)

使用 $ unwind 运算符弹出并访问对象

我的数据是

enter image description here

我的查询是何时进行汇总

[{$unwind : '$geolocation'},
     {
       $group:
         {
           _id: {city:"$geolocation.city",year: { $year: "$geolocation.date" }},
           count: { $sum: 1 }
         }
     }
   ]

结果:

{
    "_id" : {
        "city" : "Bengaluru",
        "year" : 2020
    },
    "count" : 3.0
}