2013-06-26 30 views
1

我有這樣的代碼:更好的辦法來循環

app.get('/notifications/:id', function(req, res) { 
    Notification.find({ 
    userId: req.params.id 
    }, '_id type initiatorId', function(err, notifications) { 
    if (err) return; 
    // grab all users by the `initiatorId` 
    }); 
}); 

notifications看起來就像這樣:

[ 
{ 
    initiatorId: 1 
}, 
{ 
    initiatorId: 2 
}, 
{ 
    initiatorId: 3 
} 
] 

不過,我需要抓住從用戶的詳細信息/users收集每個這些initiatorId s。什麼是做生產這種結構的最佳方式:

[ 
{ 
    initiatorId: 1, 
    user: { 
     name: 'john' 
    } 
}, 
{ 
    initiatorId: 2, 
    user: { 
     name: 'larry' 
    } 
}, 
{ 
    initiatorId: 3, 
    user: { 
     name: 'moe' 
    } 
} 
] 

回答

1

使用在通知模式的引用,然後填充它,因爲每Mongoose Docs

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema, 
    ObjectId = Schema.ObjectId, 

var notificationSchema = new Schema({ 
    initiator: { type: ObjectId, ref: 'User' } 
}); 

var Notification = mongoose.model('Notification', notificationSchema); 

然後,您可以用貓鼬的query populate method

app.get('/notifications/:id', function(req, res) { 
    Notification 
    .find({ initiator: req.params.id }) 
    .select('_id type initiatorId') 
    .populate('initiator') 
    .exec(function(err, notifications) { 
     if (err) return handleError(err); 
     // do something with notifications 
    }); 
}); 

不過,我稍微感到困惑,爲什麼ID是用戶ID(而不是一個通知ID) - 如果我使用這個API,它會讓我困惑。

這不會讓你確切地說是你想要的數據結構,但我認爲它更像是「正確」的方式,如果有這樣的事情。

+0

這是我通知的模式: 'VAR notificationSchema = mongoose.Schema({ 用戶名:字符串,//誰是它 類型:字符串, initiatorId:字符串,//誰發送的通知 讀:布爾, 日期:日期 });' – benhowdle89