繁体   English   中英

MongoDB 聚合,取值数组并获取它们的数量

[英]MongoDB aggregation, take an array of values and get their amount

这是我第一次在 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
    }...

我想要的是“会话”数组是一个 object,每个包含计数的不同日期都有一个键,所以像这样:

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

希望有道理,谢谢!!

您可以先将 map sessions转换为键值对。 然后 $group 将它们加起来。 然后使用 $arrayToObject 转换成你想要的格式。

这个Mongo 游乐场引用了这个例子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM