javascript - MongoDB, Aggregate $match fungerar inte på ObjectId


Jag har ett schema som är:

var photoSchema = new mongoose.Schema({
    id: String,     // Unique ID identifying this photo
    file_name: String,
    date_time: {type: Date, default: Date.now},
    user_id: mongoose.Schema.Types.ObjectId, // The user id of the user who created the photo.
    comments: [commentSchema] // Comment objects representing the comments made on this photo.
});

var Photo = mongoose.model('Photo', photoSchema);

Jag försöker hitta fotot från en specifik användare med flest antal kommentarer. Här är vad jag har gjort:

Photo.aggregate([
        {
            $project: {
                id: 1,
                file_name: 1,
                date_time: 1,
                user_id: 1,
                comments: 1,
                length: {$size: "$comments"}
            }
        },
        {
            $match: {
                user_id: mongoose.Schema.Types.ObjectId(request.params.id)
            }
        },
        {
            $sort: { length: -1 }
        }
        ], function (err, info2){
            if (err) {
                    // Query returned an error.
                    console.error('Doing /user/usage/:id error:', err);
                    response.status(400).send(JSON.stringify(err));
                    return;
            }
            console.log(info2);
            finalOutput.most_commented = info2[0];
            response.end(JSON.stringify(finalOutput));
        });

Jag får bara en tom array [] i console.log, jag vet att $match inte fungerar eftersom om jag tar bort $match-klausulen, får jag fotot med flest kommentarer i hela tabellen. Jag vill filtrera och få fotot som tillhör en specifik användare, baserat på deras user_id.

Jag förstår inte vad jag gör för fel. Jag har försökt:
1. $match: {user_id: mongoose.Schema.Types.ObjectId(request.params.id)}
2. $match: {user_id: request.params.id}
3. $match: {"user_id": request.params.id}

Svar #1

Första steget

const ObjectId = require('mongoose').Types.ObjectId

Andra steget

{ $match : { _id: ObjectId("606c74d5f9e3f30f8caa3451")} }

Svar #2

Id-variabeln skulle konstrueras av "strängar", och inte ObjectId-värden. Mongoose "autokastar" strängvärden för ObjectId till deras korrekta typ i vanliga frågor men inte i aggregering. Mer information - https://github.com/Automattic/mongoose/issues/1399

Det är därför du behöver göra typomvandlingen i själva koden.

{ $match : { _id: mongoose.Types("606c74d5f9e3f30f8caa3451")} }

(Glöm inte att importera mongoose)