首页 文章

MongoDB - 使用addToSet计算项目

提问于
浏览
0

我正在使用一个名为“提交”的集合,其中包括游戏的任务数据 . 每次您提交问题/任务的答案时,文档都会保存到提交集合中 .

典型文档如下所示:

{ 
    "_id" : ObjectId("5b0c99dffea598002fdb6ec9"), 
    "status" : "Accepted", 
    "missionAcceptanceDate" : NumberInt(1527526261), 
    "submissionDate" : NumberInt(1527552495), 
    "location" : "", 
    "approvalDate" : null, 
    "mission_id" : ObjectId("5b0c5b10fea598002fdb6ec6"), 
    "user_id" : ObjectId("5b0c99d0fea598002fdb6ec7")
}

我需要构建一个可以确定以下内容的查询:

  • 按日期范围计算每个分组的总提交量,

  • 计算每个分组的mission_id提交的总数 .

以下是我到目前为止(“删除一些信息......”):

QUERY

db.submissions.aggregate(
        { $match: {
            "submissionDate": {
                "$gte": NumberInt(1527901260), //Fri, 1 Jun 2018 18:00:01 PDT
                "$lte": NumberInt(1530831600) //Thu, 5 Jul 2018 16:00:00 PDT
            }
          }
        },
        {$project: 
            {_id:1,
            status: 1,
            missionAcceptanceDate: 1,
            submissionDate: 1,
            approvalDate: 1,
            user_id: 1,
            mission_id: 1
            }
        },
        {$group: {
                    _id: { status: "$status" },
                    statusTotal: { $sum: 1 },
                    mission_id: { $addToSet: "$mission_id" },
                    }
         }

)

RESULT

{ 
    "_id" : {
        "status" : "Rejected"
    }, 
    "statusTotal" : 16.0, 
    "mission_id" : [
        ObjectId("5b0edbfafea598002fdb6f3a"), 
        ObjectId("5b0f0131fea598002fdb6f43"), 
        ObjectId("5b0eded6fea598002fdb6f3d"), 
        ...
    ]
}
{ 
    "_id" : {
        "status" : "Approved"
    }, 
    "statusTotal" : 592.0, 
    "mission_id" : [
        ObjectId("5b391cf4e177c700308dd0ef"), 
        ObjectId("5b36a0d172b5240030d304be"), 
        ObjectId("5b3558276a0f950030db1732"), 
        ...
    ]
}

这是一个很好的,但我还需要知道每个“mission_id”被“拒绝”或“已批准”的总时间 . 期望的出现应该类似于以下内容:

{ 
    "_id" : {
        "status" : "Rejected"
    }, 
    "statusTotal" : 16.0, 
    "mission_id" : [

        ...
        { mission_id: ObjectId("5b0edbfafea598002fdb6f3a"), count: 3 },
        { mission_id: ObjectId("5b0f0131fea598002fdb6f43"), count: 5},
        { mission_id: ObjectId("5b0eded6fea598002fdb6f3d"), count: 2 } 
        ...
    ]
}
{ 
    "_id" : {
        "status" : "Approved"
    }, 
    "statusTotal" : 592.0, 
    "missionData" : [ 
        { mission_id: ObjectId("5b391cf4e177c700308dd0ef"), count: 23 },
        { mission_id: ObjectId("5b36a0d172b5240030d304be"), count: 45},
        { mission_id: ObjectId("5b3558276a0f950030db1732"), count: 15 } 
        ...
    ]
}

我尝试使用$ size,$ sum,$ count,甚至为每个mission_id使用{$ sum:1}的第二个$ group,但是无法理解 . 对此的任何帮助都将非常感激 . 先感谢您!

1 回答

  • 1

    如果我正确理解您的问题,您需要在小组之前额外分组 .

    就像是

    db.submissions.aggregate([
      {"$match":{"submissionDate":{"$gte":NumberInt(1527901260),"$lte":NumberInt(1530831600)}}},
      {"$group":{
        "_id":{"status":"$status","mission_id":"$mission_id"},
        "missionTotal":{"$sum":1}
      }},
      {"$group":{
        "_id":"$_id.status",
        "statusTotal":{"$sum":"$missionTotal"},
        "mission_id":{"$push":{"mission_id":"$_id.mission_id","count":"$missionTotal"}}
      }}
    ])
    

相关问题