我想将$ 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"
}
]
)
谢谢
答案 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"
}
]
)