使用两个可能字段中的值进行分组

时间:2017-05-26 09:51:24

标签: mongodb mongodb-query aggregation-framework

假设我有以下格式的匹配集合

{"user": "b", count:4},
            {"user": "c", count:3},
            {"user": "a", count:2},
            {"user": "d", count:1},
            {"user": "f", count:1},
            {"user": "e", count:1}

我想知道哪个用户的外观最多(在user1或user2中)。结果应采用此格式,按出现次数排序。

Sub sbCopyRangeToAnotherSheet()

temp = ActiveSheet.Index

Sheets(temp).Select
Range("A15:E188").Copy

Worksheets("Sheet1").Activate
k = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
Range("A" & k + 1).Select ' kindly change the code to suit your paste location
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End Sub 

有没有办法可以对两个字段的值进行分组?

类似 match.aggregate({$ group:{_ id:{$或:[“user1”,“user2]}},计数:{$ sum:1}})

3 个答案:

答案 0 :(得分:7)

db.match.aggregate([
   {$project: { user: [ "$user1", "$user2" ]}},
   {$unwind: "$user"},
   {$group: {_id: "$user", count: {$sum:1}}}
])

第一阶段将每个文档投射到用户数组

    {user: ["a", "b"]},
    {user: ["a", "c"]},
    {user: ["b", "d"]},
    ...

接下来我们展开数组

    {user:"a"},
    {user:"b"},
    {user:"a"},
    {user:"c"},
    {user:"b"},
    ...

最后的简单分组

答案 1 :(得分:0)

基本上,概念是$map到一个数组并从那里开始工作:

db.collection.aggregate([
  { "$project": {
    "_id": 0,
    "user": { "$map": {
      "input": ["A","B"],
      "as": "el",
      "in": {
        "$cond": {
          "if": { "$eq": [ "$$el", "A" ] },
          "then": "$user1",
          "else": "$user2"
        }
      }
    }}
  }},
  { "$unwind": "$user" },
  { "$group": {
    "_id": "$user",
    "count": { "$sum": 1 }
  }}
])

答案 2 :(得分:0)

Let us take an example and go through

db.users_data.find();
{
    "_id" : 1,
    "user1" : "a",
    "user2" : "aa",
    "status" : "NEW",
    "createdDate" : ISODate("2016-05-03T08:52:32.434Z")
},
{
    "_id" : 2,
    "user1" : "a",
    "user2" : "ab",
    "status" : "NEW",
    "createdDate" : ISODate("2016-05-03T09:52:32.434Z")
},
{
    "_id" : 3,
    "user1" : "b",
    "user2" : "aa",
    "status" : "NEW",
    "createdDate" : ISODate("2016-05-03T10:52:32.434Z")
},
{
    "_id" : 4,
    "user1" : "b",
    "user2" : "ab",
    "status" : "NEW",
    "createdDate" : ISODate("2016-05-03T10:52:32.434Z")
},
{
    "_id" : 5,
    "user1" : "a",
    "user2" : "aa",
    "status" : "OLD",
    "createdDate" : ISODate("2015-05-03T08:52:32.434Z")
},
{
    "_id" : 6,
    "user1" : "a",
    "user2" : "ab",
    "status" : "OLD",
    "createdDate" : ISODate("2015-05-03T08:52:32.434Z")
},
Then
db.users_data.aggregate([
        {"$group" : {_id:{user1:"$user1",user2:"$user2"}, count:{$sum:1}}} ])
    ])
will give the resuls as
{ "_id" : { "user1" : "a", "user2" : "aa" }, "count" : 2}
{ "_id" : { "user1" : "a", "user2" : "ab" }, "count" : 2}
{ "_id" : { "user1" : "b", "user2" : "aa" }, "count" : 1}
{ "_id" : { "user1" : "b", "user2" : "ab" }, "count" : 1}

Thus grouping by multiple ids are possible
Now one more variation
db.users_data.aggregate([
        {"$group" : {_id:{user1:"$user1",user2:"$user2",status:"$status"}, count:{$sum:1}}} ])
    ])

will give the resuls as
{ "_id" : { "user1" : "a", "user2" : "aa","status":"NEW" }, "count" : 1}
{ "_id" : { "user1" : "a", "user2" : "ab","status":"NEW" }, "count" : 1}
{ "_id" : { "user1" : "b", "user2" : "aa","status":"NEW" }, "count" : 1}
{ "_id" : { "user1" : "b", "user2" : "ab","status":"NEW" }, "count" : 1}
{ "_id" : { "user1" : "a", "user2" : "aa","status":"OLD" }, "count" : 1}
{ "_id" : { "user1" : "a", "user2" : "ab","status":"OLD" }, "count" : 1}

Hope that helps

快乐编程