-2

我有一个 mongo 集合。使用 node.js 驱动程序:
db.collection('notify').find();
回报:

{ _id: '1376179201714-user102',  
  state: 'unread',  
  sender: 'Daily Notify Process',  
  datereceived: 1376179201714,  
  subject: 'Training is past due!',  
  message: 'Training3 is past due!!!',  
  recipient: [ 'test@test.com' ] }  
{ _id: '1376179201714-user103',  
  state: 'unread',  
  sender: 'Daily Notify Process',  
  datereceived: 1376179201714,  
  subject: 'training is past due!',  
  message: 'Training2 is past due!!!',  
  recipient: [ 'test@test.com' ] }  
{ _id: '1376179201714-user104',  
  state: 'unread',  
  sender: 'Daily Notify Process',  
  datereceived: 1376179201714,  
  subject: 'training is past due!',  
  message: 'Training5 is past due!!!',  
  recipient: [ 'test@test.com' ] }  
{ _id: '1376179201714-user133',  
  state: 'unread',  
  sender: 'Daily Notify Process',  
  datereceived: 1376179201714,  
  subject: 'training is past due!',  
  message: 'Training1 is past due!!!',  
  recipient: [ 'test2@test.com' ] }  
{ _id: '1376179201714-user134',  
  state: 'unread',  
  sender: 'Daily Notify Process',  
  datereceived: 1376179201714,  
  subject: 'training is past due!',  
  message: 'Training2 is past due!!!',  
  recipient: [ 'test2@test.com' ] }  
{ _id: '1376179201714-user135',  
  state: 'unread',  
  sender: 'Daily Notify Process',  
  datereceived: 1376179201714,  
  subject: 'training is past due!',  
  message: 'Training4 is past due!!!',  
  recipient: [ 'test2@test.com' ] }      
{ _id: '1376179201714-user203',  
  state: 'unread',  
  sender: 'Daily Notify Process',  
  datereceived: 1376179201714,  
  subject: 'training is past due!',  
  message: 'Training1 is past due!!!',  
  recipient: [ 'test3@test.com' ] }  
{ _id: '1376179201714-user204',  
  state: 'unread',  
  sender: 'Daily Notify Process',  
  datereceived: 1376179201714,  
  subject: 'Training2 is past due!', 
  message: 'Card maker, updating member info is past due!!!',  
  recipient: [ 'test3@test.com' ] }  
{ _id: '1376179201714-user205',  
  state: 'unread',  
  sender: 'Daily Notify Process',  
  datereceived: 1376179201714,  
  subject: 'training is past due!',  
  message: 'Training3 is past due!!!',  
  recipient: [ 'test3@test.com' ] }

我可以使用 mapreduce 或 group 让它看起来像这样吗:

{recipient: ['test@test.com'],  
subject: 'Training is past due!',  
trainingblock: [  
    {message: 'Training3 is past due!!!'},  
    {message: 'Training2 is past due!!!'},   
    {message: 'Training5 is past due!!!'}  
    ]  
}  
{recipient: ['test@test.com'],  
subject: 'Training is past due!',  
trainingblock: [  
    {message: 'Training1 is past due!!!'},  
    {message: 'Training2 is past due!!!'},   
    {message: 'Training4 is past due!!!'}  
    ]  
}  
{recipient: ['test@test.com'],  
subject: 'Training is past due!',  
trainingblock: [  
    {message: 'Training1 is past due!!!'},  
    {message: 'Training2 is past due!!!'},  
    {message: 'Training3 is past due!!!'}  
    ]  
}

或者我需要在 javascript/node 端做吗?

4

1 回答 1

0

这与我在没有花费大量时间的情况下得到的一样接近。我不知道所有要求或您的数据有多少变化。例如,接收者是否总是一个值,即使它被包装在一个数组中?无论如何,它应该足够近,让您可以走完剩下的路。

它按收件人和主题分组,然后一起发送消息。reduce 函数创建容器,并且对于传入的每条消息,将值推送到训练块中。

db.collection.mapReduce(function() {
  var recipient = this.recipient[0];
  emit(recipient + "#" + this.subject, { message: this.message });
}, function(key, values) {
  var parts = key.split('#'),
      recipient = parts[0],
      subject = parts[1],
      block = { recipient: recipient, subject: subject, trainingblock: [] };

    for(var i = 0; i < values.length; i++) {
      block.trainingblock.push({ message: values[i].message });
    }

    return block;
}, {out: { inline: 1 }});
于 2013-08-14T18:56:06.023 回答