在Mongoose / MongoDB中循环获取用户详细信息的更好方法

时间:2013-06-26 22:01:01

标签: mongodb mongoose

我有这段代码:

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的用户详细信息。生成这种结构的最佳方法是什么:

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

1 个答案:

答案 0 :(得分: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);

然后您可以使用Mongoose的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会让我感到困惑。

这不会让你完全你想要的数据结构,但我觉得它更像是“正确”的方式,如果有这样的话。