Relatively Simple Scenario:
I have this Voucher
object which has a user
property (of type ObjectId
). I want to get the sum of all voucher values for a single user. Here is my current strategy, which returns an empty array:
Voucher.aggregate [
{ $match : { user : new ObjectId(user_id), expires : { $gt : new Date() } } }
{ $group : { _id : null, sum : { $sum : '$value' } } }
], (err, result)->
console.log err
console.log result
Removing the match for the user
id, and leaving the expires
field will return results. So the question becomes what is wrong with the match on user
?
Turns out the casting of the ObjectId seemed to be the issue. It was being cast using the Schema type Object Id mongoose.Schema.Types.ObjectId
when it needed to be just a pure ObjectId mongoose.Types.ObjectId
.
When using the find method or findById the query can be only:
var query = {
$or: [
{'_sender':req.body._id},
{'_recipient':req.body._id}
]
};
When using aggregate the query need a cast
var mongoose = require('mongoose');
var query = {
$or: [
{'_sender':new mongoose.Types.ObjectId(decoded._id)},
{'_recipient':new mongoose.Types.ObjectId(decoded._id)}
]
};
var aggregate = [
{
$match: {
'lenderId': new mongoose.Types.ObjectId(req.user),
'_disbursed': true
}
},
{
$unwind:'$emi'
},
{
$match: {
'emi._settled': false,
}
}
];
use toString() method.
{ $match : { user : user_id.toString() , expires : { $gt : new Date() } } }