2015-05-14 62 views
1

我是新來的MongoDB,一個應用程序,我有模式分組,記錄與MongoDB的

{ 
    date: "date", 
    data:"encrypted data", 
    sender:"sender", 
    receiver:"receiver" 
} 

和我期待的記錄組中的對象杵,與組由發送器/接收器名稱這是不等於一個特定的值。前者爲 。

{ 
    date: "date", 
    data:"encrypted data", 
    sender:"xyz", 
    receiver:"abc" 
}, 
{ 
    date: "date", 
    data:"encrypted data", 
    sender:"abc", 
    receiver:"xyz" 
}, 
{ 
    date: "date", 
    data:"encrypted data", 
    sender:"pqr", 
    receiver:"abc" 
}, 
{ 
    date: "date", 
    data:"encrypted data", 
    sender:"abc", 
    receiver:"pqr" 
}, 
{ 
    date: "date", 
    data:"encrypted data", 
    sender:"pqr", 
    receiver:"xyz" 
}, 
{ 
    date: "date", 
    data:"encrypted data", 
    sender:"xyz", 
    receiver:"pqr" 
} 

當我使用find(abc)和某些組函數時,我需要以波紋管格式的數據。

{ 
xyz:[ 
    { 
     date: "date", 
     data:"encrypted data", 
     sender:"xyz", 
     receiver:"abc" 
    }, 
    { 
     date: "date", 
     data:"encrypted data", 
     sender:"abc", 
     receiver:"xyz" 
    } 
    ], 
pqr:[ 
    { 
     date: "date", 
     data:"encrypted data", 
     sender:"pqr", 
     receiver:"abc" 
    }, 
    { 
     date: "date", 
     data:"encrypted data", 
     sender:"abc", 
     receiver:"pqr" 
    } 
    ] 
} 

如何使用$ group或mongodb的任何其他功能給出給定格式的結果?

+0

獲取除非你知道每一個單獨的名字,並將它們全部放入你的$ project語句中,否則就不可能進行聚合。但是可以爲每個用戶獲取一個對象的數組。然後,您可以將它轉換爲應用程序層上的鍵/值表。 – Philipp

+0

@菲利普,在這個世界上沒有什麼是不可能的,如果這種方式無法實現,可以用另一種方式。我找到了解決這個問題的方法。 :) –

回答

1

使用aggregation framework以實現期望的結果。聚合流水線只有最初的$project階段,它可以對流中的每個文檔進行重塑,例如通過刪除mongodb的_id字段,因爲您不需要在輸出中使用它。

下一流水線級將是$group操作步驟,其基團輸入文檔從先前$project階段通過指定標識符receiver密鑰和應用於累加器表達$addToSet到其每一個簡單地增加了系統變量$$ROOT到陣列data基。

一旦你得到了聚合管道,你需要使用它的遊標的forEach()方法來創建最終的結果對象在聚合結果迭代:

var result = {}; 
db.collection.aggregate([ 
    { 
     "$project": { 
      "_id": 0, 
      "date": 1, 
      "data": 1, 
      "sender": 1, 
      "receiver": 1 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$receiver", 
      "data": { 
       "$addToSet": "$$ROOT" 
      } 
     } 
    } 
]).forEach(function (doc){ 
     result[doc._id] = doc.data 
}); 
printjson(result); 

輸出

{ 
     "pqr" : [ 
       { 
         "date" : "date", 
         "data" : "encrypted data", 
         "sender" : "xyz", 
         "receiver" : "pqr" 
       }, 
       { 
         "date" : "date", 
         "data" : "encrypted data", 
         "sender" : "abc", 
         "receiver" : "pqr" 
       } 
     ], 
     "xyz" : [ 
       { 
         "date" : "date", 
         "data" : "encrypted data", 
         "sender" : "pqr", 
         "receiver" : "xyz" 
       }, 
       { 
         "date" : "date", 
         "data" : "encrypted data", 
         "sender" : "abc", 
         "receiver" : "xyz" 
       } 
     ], 
     "abc" : [ 
       { 
         "date" : "date", 
         "data" : "encrypted data", 
         "sender" : "pqr", 
         "receiver" : "abc" 
       }, 
       { 
         "date" : "date", 
         "data" : "encrypted data", 
         "sender" : "xyz", 
         "receiver" : "abc" 
       } 
     ] 
} 
+0

+1用於在名稱爲對象的俱樂部數據,但它不是分組,如果發送者和接收者交換。它爲這些人創建了單獨的組 –