Il problema probabile qui è che il tuo userid
value non è effettivamente un ObjectID
corretto digitare quando viene passato alla pipeline. Ciò comporta che nulla venga "abbinato" nella fase iniziale.
Quindi come esempio più completo:
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var ObjectID = require("mongodb").ObjectID;
mongoose.connect("mongodb://localhost/test");
friendSchema = new Schema({
"name": String,
"status": Number
});
memberSchema = new Schema({
friends: [friendSchema]
});
var Member = mongoose.model("Members", memberSchema );
var userid = new ObjectID("537ec520e98bcb378e811d54");
console.log( userid );
Member.aggregate([
{ "$match": { "_id": userid } },
{ "$unwind": "$friends" },
{ "$match": { "friends.status": 0 } }],
function( err, data ) {
if ( err )
throw err;
console.log( JSON.stringify( data, undefined, 2 ) );
}
);
Che poi corrisponderà ai dati come previsto:
[
{
"_id": "537ec520e98bcb378e811d54",
"friends": [{
"name": "Ted",
"status": 0
}]
}
]
Quindi fai attenzione per assicurarti che sia del tipo corretto. Il metodo aggregate non esegue il wrapping automaticamente di un valore stringa come "537ec520e98bcb378e811d54" in un ObjectID
digitare quando viene menzionato in una fase della pipeline rispetto a _id
nel modo in cui Mongoose lo fa con altri metodi di ricerca e aggiornamento.