无法使用$ match运算符与ObjectId进行mongodb / mongoose聚合

时间:2013-04-30 23:32:15

标签: mongodb mongoose aggregation-framework

相对简单的场景:

我有一个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上匹配的问题?

4 个答案:

答案 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()}}}