Frage Der $ match-Operator für die Mongodb / Mungoose-Aggregation mit ObjectId kann nicht verwendet werden


Relativ einfaches Szenario:

ich habe das Voucher Objekt mit a user Eigenschaft (des Typs ObjectId). Ich möchte die Summe aller Gutscheinwerte für einen einzelnen Benutzer erhalten. Hier ist meine aktuelle Strategie, die ein leeres Array zurückgibt:

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

Entfernen der Übereinstimmung für die user id, und verlassen die expires Das Feld gibt Ergebnisse zurück. Es stellt sich also die Frage, was mit dem Match nicht stimmt user?


5
2018-04-30 23:32


Ursprung


Antworten:


Es stellte sich heraus, dass das Casting der ObjectId das Problem war. Es wurde mit der Objekt-ID des Schematyps umgewandelt mongoose.Schema.Types.ObjectId wenn es nur eine reine ObjectId sein musste mongoose.Types.ObjectId.


43
2018-05-01 04:54



Bei Verwendung der Methode find oder findById kann die Abfrage nur lauten:

var query = {
    $or: [
        {'_sender':req.body._id},
        {'_recipient':req.body._id}
    ]
};

Wenn Sie Aggregat verwenden, muss die Abfrage umgesetzt werden

var mongoose = require('mongoose');
var query = {
    $or: [
        {'_sender':new mongoose.Types.ObjectId(decoded._id)},
        {'_recipient':new mongoose.Types.ObjectId(decoded._id)}
    ]
};

7
2018-03-01 17:20



var aggregate  = [
{
                $match: {
                    'lenderId': new mongoose.Types.ObjectId(req.user),
                    '_disbursed': true
                }
            },
            {
                $unwind:'$emi'
            },
            {
                $match: {
                    'emi._settled': false,
                }
            }
];

1
2018-05-19 08:29