2014-11-04 117 views
1

我使用节点和猫鼬,并有一个模式,看起来像这样:

var SubscriberSchema = new Schema({ 
    'user': [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }], 
    'level': { type: String, enum: [ 'owner', 'sub', 'commenter', 'poster' ] } 
    'dateAdded': { type: Date, default: Date.now } 
}); 

// Group Schema 
var GroupSchema = new Schema({ 
    'groupOwner': [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }], 
    'groupName': String, 
    'subscribers': [SubscriberSchema], 
}); 

我想查询组中找到的所有组,其中一个用户(通过令牌认证存储在req.user._id中)是一个用户(即他们的_idsubscribers数组中),并且只返回单个用户数组元素及其_id

我已阅读$elemMatch的Mongo文档,因为这似乎是我需要的,并在下面构建了查询。这将返回我想要的信息,但会返回subscribers数组的所有元素。我如何才能返回subscribers阵列中匹配我的req.user._id的单个元素?

当前查询,返回subscribers所有元素:

  Group 
       .find({ "subscribers.user": req.user._id}, { subscribers: { $elemMatch: { user: req.user._id }}}) 
       .sort('groupName') 
       .populate('groupOwner', 'email firstName lastName') 
       .populate('subscribers.user', 'email firstName lastName') 
       .exec(function(err, data) { 
        if (err) { 
         logger.error('Unable to retrieve groups for user: ' + err.message); 
         res.status(500) 
        } else { 
         res.json(data); 
        } 
       }); 

这将返回用户以下(通过util.inspect(data[0].subscribers)):

Subscribers 
[{ 
    user: 
    [ { _id: 1234, 
     email: '[email protected]', 
     firstName: 'Testy', 
     lastName: 'Testelson' } ] } 
    user: 
    [ { _id: 5678, 
     email: '[email protected]', 
     firstName: 'Biggy', 
     lastName: 'Smalls' } ] }] 

基于$ elemMatch文档,我想我会因为这是匹配req.user._id的记录,所以只能看到用户1234。我在这里做错了什么?

谢谢!

回答

2

在您的投影参数,使用dollar operator

{"user.$": 1} 

这将在其“用户”阵列只有一个对象返回一个组。

相关问题