2015-01-31 92 views
0

下面是我收集的json部分:MongoDB聚集对象数组的对象?

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

我想先到了一个aggregate命令将返回我下面的:

[{ "_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

我可能失去了一些东西,但在我看来,你的原始数据是非常相似的,你想要什么要得到。是否有多个文档的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提供的方式更容易,因为您不必使用Aggregation Framework,也不需要展开任何可能长的数组。

3

尝试此查询:

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" 
      ] 
     } 
    ] 
}