在MongoDB聚合中返回整个对象

zul*_*kha 3 mongodb mongodb-query aggregation-framework

我有项目架构,其中我有各自餐厅的项目详细信息.我必须通过'类型'和'类别'找到特定餐厅和团体的所有项目(类型和类别是项目架构中的字段),我能够按照我的要求对项目进行分组,但我无法获得完整的项目宾语.我的查询:

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

我已经看到一种方法,通过将每个字段值添加到组然后投影它.因为我的Item模式中有很多字段,所以我觉得这对我来说不是很好的解决方案,我是否可以获得完整的对象而不是Ids.

Bla*_*ven 8

那么你总是可以使用$$ROOT你的服务器是MongoDB 2.6或更高版本:

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

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

这样做时需要小心,因为更大的结果肯定会破坏BSON限制.

我建议您尝试构建某种"搜索结果",其中包括"facet count"或类似内容.为此,您最好为"聚合"部分运行单独的查询,为实际文档结果运行一个查询.

这比将所有内容组合在一起更加安全和灵活.