Es gibt keine Möglichkeit, während des aggregierten Prozesses auf objektreferenzierte Daten zuzugreifen. Die Umgehung, die ich für mein Projekt verwendet habe, bestand darin, einen Verweis auf den Eigentümer in den fraglichen Schemas hinzuzufügen.
User = new Schema({
places:[{type: Schema.Types.ObjectId, ref:'Place'}],
shouts:[{type: Schema.Types.ObjectId, ref:'Shout'}]
});
Place = new Schema({
owner:{type: Schema.Types.ObjectId, ref:'Place'},
name:String,
description:String,
});
Shout = new Schema({
owner:{type: Schema.Types.ObjectId, ref:'Place'},
content:String,
});
Und dann verwendet, um direkt auf dem Unterdokument zu aggregieren, um die eindeutigen Benutzer zu erhalten, denen die Instanzen des Ortes gehören. Auf diese Weise kann ich ein Shout-Ergebnis erhalten, das einer Abfrage und einem Ort entspricht.
Beispiel:
module.exports.askForShoutInPlace = function(req, res){
var pname = new RegExp(req.params.pname, 'i');
var stringQ = new RegExp(req.paramos.qcontent, 'i');
Place.aggregate(
[
//find Places that match criteria
{'$match':{'name':pname}},
//select owner id object to result
{'$project':{ owner:'$owner'}},
//group those results to single array with unique ids of users
{'$group':{_id:'$owner'}}
]).exec(function(err, results){
//find user shouts that match string and belong to owners know to be owners of a place
Shout.find({'content':stringQ}).where({'owner':{'$in':results}}).exec(function(err, shouts){
res.send(shouts);
});
});
}
Dies ist genau der Weg, den ich gefunden habe, um meine speziellen Bedürfnisse zu umgehen. Ich hoffe, es könnte jemandem helfen.