MongoDB 将 objects 与 objects 的数组聚合?
MongoDB aggregate objects with an array of objects?
这是我在 json
中 collection 的一部分:
[{"company":"Lenovo", "models":
[{"model":"ThinkPad T400", "gens":
[{"gen":"3", "start":2012},
{"gen":"2", "start":2008},
{"gen":"1", "start":2004}]
}...]
}...]
我正在尝试 come-up 使用聚合命令 return 我将得到以下内容:
[{ "_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"] ]
}...]
}...]
这可能是因为我的每个 object 都有一个 object 的数组(模型)并且 object 也有一个 object 的数组(Gens ).
对 MongoDB 的正确请求是 return 我期望的结果?
试试这个查询:
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"
]
}
]
}
我可能在这里遗漏了一些东西,但在我看来,您的原始数据与您想要获得的数据非常相似。是否有多个文档将 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 提供它会更容易,因为您不必使用聚合框架而且您不会不需要展开任何可能很长的数组。
使用$unwind操作符弹出并访问对象
我的数据是
我的查询是在我进行聚合时
[{$unwind : '$geolocation'},
{
$group:
{
_id: {city:"$geolocation.city",year: { $year: "$geolocation.date" }},
count: { $sum: 1 }
}
}
]
结果:
{
"_id" : {
"city" : "Bengaluru",
"year" : 2020
},
"count" : 3.0
}
这是我在 json
中 collection 的一部分:
[{"company":"Lenovo", "models":
[{"model":"ThinkPad T400", "gens":
[{"gen":"3", "start":2012},
{"gen":"2", "start":2008},
{"gen":"1", "start":2004}]
}...]
}...]
我正在尝试 come-up 使用聚合命令 return 我将得到以下内容:
[{ "_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"] ]
}...]
}...]
这可能是因为我的每个 object 都有一个 object 的数组(模型)并且 object 也有一个 object 的数组(Gens ).
对 MongoDB 的正确请求是 return 我期望的结果?
试试这个查询:
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"
]
}
]
}
我可能在这里遗漏了一些东西,但在我看来,您的原始数据与您想要获得的数据非常相似。是否有多个文档将 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 提供它会更容易,因为您不必使用聚合框架而且您不会不需要展开任何可能很长的数组。
使用$unwind操作符弹出并访问对象
我的数据是
我的查询是在我进行聚合时
[{$unwind : '$geolocation'},
{
$group:
{
_id: {city:"$geolocation.city",year: { $year: "$geolocation.date" }},
count: { $sum: 1 }
}
}
]
结果:
{
"_id" : {
"city" : "Bengaluru",
"year" : 2020
},
"count" : 3.0
}