mongodb - 在 MongoDB 聚合中返回整个对象

标签 mongodb mongodb-query aggregation-framework

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

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 限制。

我建议您尝试构建某种具有“方面计数”或类似内容的“搜索结果”。为此,您最好为“聚合”部分运行一个单独的查询,并为实际文档结果运行一个查询。

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

关于mongodb - 在 MongoDB 聚合中返回整个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32065276/

相关文章:

java - MongoDB+Azure+Android : Error: com. mongodb.MongoException:不与master对话并且重试用完

mongodb - Mongo 项目测试值是否在数组中

MongoDB:列表中的几个字段

mongodb - 如何汇总和平均两个日期之间的时间?

mongodb - 如何根据嵌入式数组过滤文档?

javascript - 根据某些条件,使用 mongodb 聚合从数组中获取对象以及同一级别的其他字段

javascript - 在与 mongoDb 和 mongoose 聚合后填充单个 ObjectId 引用

javascript - 如何并行执行更新

mongodb - mongodb 查找中的条件 'from'

python - 遍历 PyMongo 游标抛出 InvalidBSON : year is out of range