【问题标题】:Add field to aggregate in mongodb [duplicate]在mongodb中添加要聚合的字段[重复]
【发布时间】:2018-04-21 17:27:18
【问题描述】:

我有收藏用户:

{ “_id”:ObjectId(“59fdc96ce166111e8da178f3”), “身份证”:724207, “游戏名”:“梅勒”, “报告”:[ { “行动”:“伞”, “exp”:64, “日期”:1509811977 }, { “行动”:“伞”, “exp”:53, “日期”:1509812077 }, {“行动”:“伞”, “exp”:55, “日期”:1509815977 } ], “小队”:[ { “小队”:“温度”, “日期”:1509880801 } ] }

我有这个问题:

db.getCollection('Users').aggregate([
    {
        $project:
            {
            _id : true,
            gamename: true,
            reports: true
            }
    },
    {
        $unwind : '$reports',
    },
    {
        $match : {
            'reports.date' : {'$gte': 1509815900, '$lte':1509816000}
        }
    },
    {
        $group : {
            _id : '$_id',
            //id: 'id',
            reports : {$addToSet : '$reports'}
        }
    }
])

它给了我想要的东西(给定时间段的用户报告),但是结果集中没有游戏名。如何添加?

谢谢。

【问题讨论】:

  • $first。您只会取出您放入的内容,因此您需要某种类型的累加器,$first 符合$unwind 之后的要求。你也可以看看$filter,而不是首先使用$unwind

标签: mongodb aggregate


【解决方案1】:

您可以将游戏名称作为分组键的一部分,然后您可以再次使用 $project 来恢复原始结构

db.getCollection('Users').aggregate([
    {
        $project:
            {
            _id : true,
            gamename: true,
            reports: true
            }
    },
    {
        $unwind : '$reports',
    },
    {
        $match : {
            'reports.date' : {'$gte': 1509815900, '$lte':1509816000}
        }
    },
    {
        $group : {
            _id : { _id: '$_id', gamename: '$gamename'},
            reports : {$addToSet : '$reports'}
        }
    },
    {
        $project : {
            reports: 1,
            _id : "$_id._id",
            gamename: "$_id.gamename"
        }
    }
])

【讨论】:

  • 我没有意识到,我可以使用项目两次。非常感谢,我已经开始考虑切换回 MySQL。
猜你喜欢
  • 2022-11-23
  • 2019-10-27
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
相关资源
最近更新 更多