Mongodb尝试从聚合中返回选定的字段

don*_*sci 5 mongoose mongodb node.js aggregation-framework

我的聚合功能有问题.我正在尝试从数据库中获取用户最常见的订单,但我只返回名称和计数.我已经尝试过使用$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 })
Run Code Online (Sandbox Code Playgroud)

这只产生如下输出,{"count":10, "name": foo"}而我想返回整个对象; 嵌入式文档和所有.我出错的任何想法?

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

文献:

{
    "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
                        }
                    ]
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

预期结果:

[
    {
        "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
   }
Run Code Online (Sandbox Code Playgroud)

]

谢谢!

Nei*_*unn 11

在这里,大体上讲,$project依赖于"右手"侧文档中的字段属性的"绝对路径".诸如1仅用于该元素实际上是文档顶层的快捷方式.

此外,您还需要能够保留字段$group,因此您可以使用各种分组操作符,例如$first和/ $addToSet$push保留从内部数组中传出的信息.而且你必须$unwind在这里两次,因为你在文档中组合"类型",而你不想只是$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) {

});
Run Code Online (Sandbox Code Playgroud)