在 MongoDB 聚合中返回整个对象

Returning whole object in MongoDB aggregation

我有项目架构,其中我有各个餐厅的项目详细信息。我必须找到特定餐厅的所有项目,并使用 'type' 和 'category' 对它们进行分组(类型和类别是项目模式中的字段),我可以根据需要对项目进行分组,但我不能获得完整的项目对象。 我的查询:

db.items.aggregate([{
    '$match': {
        'restaurant': ObjectId("551111450712235c81620a57")
    }
}, {
    '$group': {
        id: {
            '$push': '$_id'
        }
        , _id: {
            type: '$type'
            , category: '$category'
        }
    }
}, {
    $project: {
        id: '$id'
    }
}])

我见过一种方法,将每个字段值添加到组中,然后对其进行投影。因为我的 Item 模式中有很多字段,所以我觉得这对我来说不是很好的解决方案,我能否获得完整的对象而不是仅 ID。

你可以随时使用 $$ROOT,前提是你的服务器是 MongoDB 2.6 或更高版本:

db.items.aggregate([
    { '$match': {'restaurant': ObjectId("551111450712235c81620a57")}},
    { '$group':{
        _id : {
            type : '$type',
            category : '$category'
       },
       id: { '$push': '$$ROOT' },
    }}
])

这将把每个完整的对象放入数组的成员中。

执行此操作时需要小心,因为如果结果较大,您肯定会打破 BSON 限制。

我建议您尝试用 "facet counts" 或类似的方法构建某种 "search results"。为此,您最好 运行 对 "aggregation" 部分进行单独查询,对实际文档结果进行单独查询。

与尝试将所有内容组合在一起相比,这是一种更安全、更灵活的方法。