我有两个带有以下结构的文件
{
"CollegeName" : "Hi-Tech College",
"StudentName" : "John",
"Age" : 25
},
{
"CollegeName" : "Hi-Tech College",
"StudentName" : "Tom",
"Age" : 24
}
在这两个文件中,collegename是常用字段,通过使用我希望生成以下格式的单个文档
{
"CollegeName" : "Hi-Tech College",
"JohnAge" : 25,
"TomAge" : 24
}
答案 0 :(得分:2)
您可以尝试以下聚合:
db.col.aggregate([
{
$group: {
_id: null,
CollegeName: { $first: "$CollegeName" },
Students: { $push: { k: { $concat: [ "$StudentName", "Age" ] }, v: "$Age" } }
}
},
{
$replaceRoot: {
newRoot: { $mergeObjects: [ { CollegeName: "$CollegeName" }, { $arrayToObject: "$Students" } ] }
}
}
])
基本上,要动态创建密钥名称,您可以使用$arrayToObject运算符,该运算符获取一组键值对(k
和v
属性)并返回一个对象。要创建自定义键,您可以使用$concat。然后你必须"合并"新的动态创建的对象CollegeName
,因此您可以使用$mergeObjects和$replaceRoot运算符。
由于它按null
分组,为整个集合返回一个文档,因此您必须记住MongoDB具有BSON文档大小限制,因此您的结果不能超过16MB。更多here。
答案 1 :(得分:0)
db.temp.aggregate([
{"$group":{"_id":{"CollegeName":"$CollegeName"},
"Students":{"$push":{"StudentName":"$StudentName","Age":"$Age"}}}}
,{"$unwind":"$Students"}
,,{"$group":{"_id":"$_id",
'JohnAge': { $max: {$cond: [ {$or: [
{$eq:['$Students.StudentName', 'John']}
]}
, '$Students.Age', null] } },
'TomAge': { $max: {$cond: [ {$or: [
{$eq:['$Students.StudentName', 'Tom']}
]}
, '$Students.Age', null] } }
}}
])