用$ elemMatch只返回一个子数组的第一个元素

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

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], }); 

我想查询该组以查找用户(通过令牌authentication存储在req.user._id )是订户的所有组(即它们的_idsubscribers数组中),并且只返回单个订户数组元素_id

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

当前查询,返回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: 'me@here.com', firstName: 'Testy', lastName: 'Testelson' } ] } user: [ { _id: 5678, email: 'you@there.com', firstName: 'Biggy', lastName: 'Smalls' } ] }] 

基于$ elemMatch文档,我会假设我只会看到用户1234,因为这是匹配req.user._id的logging。 我在这里做错了什么?

谢谢!

在您的投影参数中,使用美元运算符 :

 {"user.$": 1} 

这将返回一个Group,其“订阅者”数组中只有一个对象。