2014-11-04 261 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} 

這將在其「用戶」陣列只有一個對象返回一個組。