如何在聚合查询中显示不属于$ group子句的列

时间:2015-02-03 15:51:54

标签: mongodb

我想将$ unwind操作的结果输出到另一个集合并获得重复的_id错误。为了克服它,我使用$ group来生成一个新的_id字段。如何从集合中投射额外的字段?当我使用$ project子句时,它不会输出任何内容。

这个有效:

db.audit.aggregate([
{$match: { "date": { $gte : ISODate("2015-01-30T00:00:00.000Z"),
                     $lt : ISODate("2015-01-31T00:00:00.000Z")
                    }
                }
            },
{ $unwind : "$data.items" } ,

{ $group : {
    "_id" : {
         "_id":"$_id",
         "sku":"$data.items.sku"
            }
    } 
},
{ 
    $out : "randomAggregates"
}
]
)

这个没有:

db.audit.aggregate([
{$match: { "date": { $gte : ISODate("2015-01-30T00:00:00.000Z"),
                     $lt : ISODate("2015-01-31T00:00:00.000Z")
                    }
                }
            },
{ $unwind : "$data.items" } ,
{ $project: { "ccy" : "$data.crncy",  
              "coo" : "$data.items.coo",
              "order_id" : "$meta.refid"
            }
},
{ $group : {
    "_id" : {
         "_id":"$_id",
         "sku":"$data.items.sku"
            }
    } 
},
{ 
    $out : "randomAggregates"
}
]
)

谢谢

1 个答案:

答案 0 :(得分:0)

使用$group阶段中的$first运算符,并使用$$ROOT变量访问整个文档。

{$group:{"_id":{"_id":"$_id","sku":"$data.items.sku"},
         "value":{$first:"$$ROOT"}}}

,或者

   {$group:{"_id":{"_id":"$_id","sku":"$data.items.sku"},
             "field":{$first:"$field"}}}  // do this for all the fields.

您修改后的代码如下所示:

db.audit.aggregate([
{$match: { "date": { $gte : ISODate("2015-01-30T00:00:00.000Z"),
                     $lt : ISODate("2015-01-31T00:00:00.000Z")
                    }
                }
            },
{ $unwind : "$data.items" } ,
{$group:{"_id":{"_id":"$_id","sku":"$data.items.sku"},
         "value":{$first:"$$ROOT"}}}   // you could do it for individual 
                                       // fields as well here
{ 
    $out : "randomAggregates"
}
]
)