相对简单的场景:
我有一个Voucher
对象,它具有user
属性(类型为ObjectId
)。我想获得单个用户的所有凭证值的总和。这是我当前的策略,它返回一个空数组:
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
删除user
ID的匹配项,并离开expires
字段将返回结果。那么问题就变成了user
上匹配的问题?
答案 0 :(得分:49)
原来,ObjectId的转换似乎是个问题。当它需要只是一个纯ObjectId mongoose.Schema.Types.ObjectId
时,它使用Schema类型Object Id mongoose.Types.ObjectId
进行强制转换。
答案 1 :(得分:11)
使用find方法或findById时,查询只能是:
var query = {
$or: [
{'_sender':req.body._id},
{'_recipient':req.body._id}
]
};
使用聚合时,查询需要强制转换
var mongoose = require('mongoose');
var query = {
$or: [
{'_sender':new mongoose.Types.ObjectId(decoded._id)},
{'_recipient':new mongoose.Types.ObjectId(decoded._id)}
]
};
答案 2 :(得分:2)
var aggregate = [
{
$match: {
'lenderId': new mongoose.Types.ObjectId(req.user),
'_disbursed': true
}
},
{
$unwind:'$emi'
},
{
$match: {
'emi._settled': false,
}
}
];
答案 3 :(得分:1)
使用toString()方法。
{$ match:{user:user_id.toString(),到期时间:{$ gt:new Date()}}}