2015-05-14 59 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用于在名称为对象的俱乐部数据,但它不是分组,如果发送者和接收者交换。它为这些人创建了单独的组 –