Mongodb 匹配数组包含值的位置

Mongodb 匹配数组包含值的位置,mongodb,aggregation-framework,Mongodb,Aggregation Framework,这是我正在使用的模式示例。我想获得我的用户id所在的团队。我可以通过以下方式进行查找: var mongoose = require('mongoose'), ObjectId = require('mongoose').Types.ObjectId, Schema = mongoose.Schema; var teamAttendanceSchema = new Schema({ allMembers: [{type: Schema.Types.ObjectId, r

这是我正在使用的模式示例。我想获得我的用户id所在的团队。我可以通过以下方式进行查找:

var mongoose = require('mongoose'),
    ObjectId = require('mongoose').Types.ObjectId,
    Schema = mongoose.Schema;

var teamAttendanceSchema = new Schema({
    allMembers: [{type: Schema.Types.ObjectId, ref: 'user' }],
    currentDate: {type: Date, default: Date.now()}, 
    team_id : {type: Schema.Types.ObjectId, ref: 'team' },
    presentMembers: [{type: Schema.Types.ObjectId, ref: 'user' }],

});

module.exports = mongoose.model('attendance', teamAttendanceSchema);
但我想对组使用聚合。我想让用户团队知道他在场的天数。我尝试了以下操作,但不起作用:-

var user_id = req.body.user_id;
TeamAttendance.find({ allMembers : user_id})

在聚合中,请尝试$In并确保userId是ObjectId,我认为聚合管道的主要问题可能是userId在字符串中,但聚合需要mongoose object id才能工作,请尝试以下操作:

var user_id = req.body.user_id;

  TeamAttendance.aggregate(
    [
    {$match : { allMembers : user_id },
    {$group : {
      _id : "$team_id"
    }}
    ]).exec()

}

在从$match查询中获得结果后,您还可以使用npm中的下划线库,然后使用下划线的u.groupBy()方法。

谢谢@sushant。问题是我没有将用户id转换为对象。mongoose.Types.ObjectId(req.body.user\u id)——这救了我。
let mongoose = require('mongoose');
var user_id = mongoose.Types.ObjectId(req.body.user_id);

  TeamAttendance.aggregate(
    [
    {$match : { allMembers : {$in:[user_id]} },
    {$group : {
      _id : "$team_id"
    }}
    ]).exec()
 schedules.aggregate([
            {
                "$match":
                {
                    "offdeleveryDate.startOffDate": { $lte: new Date(start) },
                    "offdeleveryDate.endOffDate": { $gte: new Date(end) },

                }
        }, {
            "$match": query
        }, {
            "$lookup": {
                "from": "users",
                "localField": "userId",
                "foreignField": "_id",
                "as": "userInfo"

            }
        },
        {
            "$unwind": {
                "path": "$userInfo",
                "preserveNullAndEmptyArrays": true
            }
        },
        {
            "$lookup": {
                "from": "products",
                "localField": "productId",
                "foreignField": "_id",
                "as": "productInfo"

            }
        },
        {
            "$unwind": {
                "path": "$productInfo",
                "preserveNullAndEmptyArrays": true
            }
        },
        {
            "$lookup": {
                "from": "services",
                "localField": "serviceTypeId",
                "foreignField": "_id",
                "as": "serviceInfo"

            }
        },
        {
            "$unwind": {
                "path": "$serviceInfo",
                "preserveNullAndEmptyArrays": true
            }
        },
        {
            "$project": {
                "customerName": 1,
                "serviceProviderName": 1,
                "createdForID": 1,
                "customerPhoneNumber": 1,
                "serviceType": "$serviceInfo.serviceType",
                "productName": "$productInfo.productName",
                "quantity": 1,
                "unit": "$productInfo.unit",
                "offdeleveryDate.startOffDate": 1,
                "offdeleveryDate.endOffDate": 1,
                "startOffDate": { '$dateToString': { format: '%Y-%m-%d', date: '$offdeleveryDate.startOffDate' } },
                "endOffDate": { '$dateToString': { format: '%Y-%m-%d', date: '$offdeleveryDate.endOffDate' } }
            }
        },
        {
            "$group": {
                "_id": {
                    "customerID": "$createdForID",
                    "customerName": "$customerName",
                    "customerPhoneNumber": "$customerPhoneNumber",
                    "serviceProviderName": "$serviceProviderName"
                },
                "customerDetails": {
                    "$push": {
                        "serviceType": "$serviceType",
                        "productName": "$productName",
                        "quantity": "$quantity",
                        "unit": "$unit",
                        "startOffDate": "$startOffDate",
                        "endOffDate": "$endOffDate"
                    }
                }

            }

        }
    ], function (err, data) {
        if (err) {
            return reply(Boom.forbidden(err));
        } else {
            if (data && data.length) {
                return reply(Common.successResponse('Success', data));
            } else {
                return reply(Common.successResponse('No entry available for this date.'));
            }
        }
    });
});