MongoDB使用对象数组聚合对象?
以下是我在MongoDB使用对象数组聚合对象?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,以下是我在json中收集的一部分: [{"company":"Lenovo", "models": [{"model":"ThinkPad T400", "gens": [{"gen":"3", "start":2012}, {"gen":"2", "start":2008}, {"gen":"1", "start":2004}] }...] }...] 我正在尝试生成一个聚合命令,该命令将返回以下内容: [{ "_id":"
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"] ]
}...]
}...]
这可能是因为每个my对象都有一个对象数组(模型),而对象也有一个对象数组(Gens)
什么是对MongoDB的正确请求,可以返回我的预期结果?尝试以下查询:
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"
]
}
]
}
我可能遗漏了一些东西,但在我看来,您的原始数据与您想要得到的非常相似。是否有多个文档将
公司
设置为联想
如果没有,您可以使用更简单的命令获得所需的内容:
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
}
]
}
]
}
只有在公司字段已经是唯一的情况下,它才会起作用,但是MongoDB提供它会更容易,因为您不必使用聚合框架,也不需要展开任何可能的长数组。使用$unwind操作符弹出并访问对象 我的数据是 我的查询是在进行聚合时进行的
[{$unwind : '$geolocation'},
{
$group:
{
_id: {city:"$geolocation.city",year: { $year: "$geolocation.date" }},
count: { $sum: 1 }
}
}
]
结果:
{
"_id" : {
"city" : "Bengaluru",
"year" : 2020
},
"count" : 3.0
}