自定义现有文档并在mongo聚合中添加新字段

时间:2018-06-07 13:43:40

标签: mongodb aggregation-framework

我有两个带有以下结构的文件

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

2 个答案:

答案 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运算符,该运算符获取一组键值对(kv属性)并返回一个对象。要创建自定义键,您可以使用$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] } }
    }}
])