【问题标题】:MongoDB aggregation, take an array of values and get their amountMongoDB 聚合,获取一组值并获取它们的数量
【发布时间】:2021-03-28 15:08:03
【问题描述】:

这是我第一次在 StackOverflow 中提问,我希望我能解释一下我的目标。 我的文件看起来像这样:

    "_id" : ObjectId("5fd76b67a7e0fa652a297a9f"),
    "type" : "play",
    "session" : "5b0b5d57-c3ca-415f-8ef6-49bbd5805a23",
    "episode" : 1,
    "show" : 1,
    "user" : 1,
    "platform" : "spotify",
    "currentTime" : 0,
    "date" : ISODate("2020-12-14T13:40:51.906Z"),
    "__v" : 0
}

我想获取一个节目并按剧集对其进行分组。我的聚合已经走到了这一步:

    const filter = { user, show, type: { $regex: /^(play|stop|close)$/ } }
    const requiredFields = { "episode": 1, "session": 1, "date": 1, "currentTime": 1 }
    // Get sessions grouped by episode
    const it0 = {
        _id: '$episode',
        session:
            {$addToSet:
                {_id: "$session",
                date:{$dateToString: { format: "%Y-%m-%d", date: "$date" }},
                averageOfSession: {$cond: [ { $gte: [ "$currentTime", 0.1 ] }, "$currentTime", null ] }
            },
            },
        count: { $sum: 1 }
    }
    // Filter unique sessions by session id and add them to a sessions field
    const reduceSessions = {$addFields:
            {sessions: {$reduce: {input: "$session",initialValue: [],in:
            {$concatArrays: ["$$value",{$cond: [{$in: ["$$this._id","$$value._id"]},[],["$$this"]]}]}
            }}}}

    const projection = { $project: { _id: 0, episode: "$_id", plays: {$size: '$sessions'}, dropoff: {$avg: "$sessions.averageOfSession"}, sessions: '$session.date', events: "$count" } }

        const arr = await Play.aggregate([
            { $match: filter }, {$project: requiredFields}, {$group: it0}, reduceSessions,
            projection,{ $sort : { _id : 1 } }
        ])

这是我目前的结果:

    {
        "episode": 5,
        "plays": 4,
        "dropoff": 3737.25,
        "sessions": [
            "2020-11-15",
            "2020-11-15",
            "2020-11-16",
            "2020-11-15"
        ],
        "events": 4
    }...

我希望“会话”数组成为一个对象,每个不同的日期都有一个键,其中包含计数,所以是这样的:

 {
        "episode": 5,
        "plays": 4,
        "dropoff": 3737.25,
        "sessions": {
            "2020-11-15": 3,
            "2020-11-16": 1
        },
        "events": 4
    }...

希望有道理,谢谢!!

【问题讨论】:

    标签: node.js mongodb mongoose nosql nosql-aggregation


    【解决方案1】:

    您可以先将sessions 映射成键值对。然后 $group 他们把总和加起来。然后使用 $arrayToObject 转换成你想要的格式。

    Mongo playground 引用this example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2014-01-26
      • 2019-12-29
      • 2019-04-08
      相关资源
      最近更新 更多