Mongodb 匹配数组包含值的位置
这是我正在使用的模式示例。我想获得我的用户id所在的团队。我可以通过以下方式进行查找: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
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.'));
}
}
});
});