2017-05-26 20 views
1

值比方說,我有一個匹配集合中的格式如下組使用來自兩個可能的領域

 {user1: "a", user2: "b"}, 
     {user1: "a", user2: "c"}, 
     {user1: "b", user2: "d"}, 
     {user1: "b", user2: "c"}, 
     {user1: "b", user2: "e"}, 
     {user1: "c", user2: "f"} 

我想知道哪些用戶擁有最外觀(無論是在用戶1或用戶2)。結果應該按照這種格式按發生次數排序。

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

有沒有一種方法可以對兩個字段的值進行分組?

喜歡的東西match.aggregate({$組:{_id:{$或:[ 「USER1」,「用戶2]}},計數:{$總和:1}})

回答

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"]}, 
    ... 

接下來我們在最後

+1

良好的漁獲放鬆陣列

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

而且簡單的分組。我忘了這是從3.2開始允許的 –

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 } 
    }} 
]) 
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 

快樂編程