Mongodb试图让选定的字段从聚合返回

我遇到了我的聚合函数的麻烦。 我试图从数据库中获得用户最常见的订单,但我只返回名称和计数。 我已经尝试使用$project运营商,但我似乎无法让它返回什么比$group中的内容。

这是我目前的聚合函数:

 OrderModel.aggregate( {$unwind: "$products"}, {$match: { customerID: customerID }}, {$group: { _id: "$products.name", count: {$sum:1}}}, {$project: {name: "$_id", _id:0, count:1, active:1}}, {$sort: {"count" : -1}}, {$limit: 25 }) 

这只是产生一个输出如下{"count":10, "name": foo"}而我想返回整个对象;embedded式文档和所有。

编辑 – 添加示例文档和预期输出

文件:

 { "charge": {}, "captured": true, "refunds": [ ], "balance_transaction": "txn_104Ics4QFdqlbCVHAdV1G2Hb", "failure_message": null, "failure_code": null, "amount_refunded": 0, "customer": "cus_4IZMPAIkEdiiW0", "invoice": null, "dispute": null, "statement_description": null, "receipt_email": null }, "total": 13.2, "userToken": "cus_4IZMPAIkEdiiW0", "customerID": "10152430176375255", "_id": "53ad927ff0cb43215821c649", "__v": 0, "updated": 20140701082928810, "created": 20140627154919216, "messageReceived": false, "ready": true, "active": false, "currency": "GBP", "products": [ { "name": "Foo", "active": true, "types": [ { "variants": [ { "name": "Bar", "isDefault": false, "price": 13.2 } ] } ] } ] } 

预期结果:

 [ { "name": "Foo", "active": true, "types": [ { "variants": [ { "name": "Bar", "isDefault": false } ] }, { "variants": [ { "name": "Something else", "isDefault": false } ] } ], "quantity": 10 }, { "name": "Another product", "active": true, "types": [ { "variants": [ { "name": "Bar", "isDefault": false } ] } ], "quantity": 7 } 

]

谢谢!

在这里大体上讲, $project依赖于“右手边”文档中字段属性的“绝对path”。 诸如1类的快捷方式仅用于该元素实际上是文档的顶层的位置。

你还需要能够保留字段,当你$group ,所以这是你使用各种分组操作符,如$first$addToSet$push以保持你从内部数组$addToSet的信息。 而且你还必须在这里$unwind两次,因为你在文档中结合了“types”,在这种情况下你不希望只有$first

 OrderModel.aggregate([ { "$unwind": "$products" }, { "$unwind": "$products.types" }, { "$group": { "_id": "$products.name", "active": { "$first": "$products.active" }, "types": { "$addToSet": "$products.types" }, "quantity": { "$sum": 1 } }}, { "$project": { "_id": 0, "name": "$_id", "active": 1, "types": 1, "quantity": 1 }} ],function(err,results) { });