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

时间:2014-11-04 13:38:34

标签: node.js mongodb mongoose

我正在使用node和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],
});

我想查询该组以查找用户(通过令牌身份验证存储在req.user._id中)是订阅者的所有组(即他们的_id位于subscribers数组中) ,只返回单个subscriber数组元素及其_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: 'me@here.com',
       firstName: 'Testy',
       lastName: 'Testelson' } ] }
  user: 
   [ { _id: 5678,
       email: 'you@there.com',
       firstName: 'Biggy',
       lastName: 'Smalls' } ] }]

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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

{"user.$": 1}

这将返回一个群组,其订阅者中只有一个对象'阵列。