come usare popolare e aggregato nella stessa dichiarazione?

questa è la mia collezione di appuntamenti

{ _id: ObjectId("518ee0bc9be1909012000002"), date: ISODate("2013-05-13T22:00:00Z"), patient:ObjectId("518ee0bc9be1909012000002") } { _id: ObjectId("518ee0bc9be1909012000002"), date: ISODate("2013-05-13T22:00:00Z"), patient:ObjectId("518ee0bc9be1909012000002") } { _id: ObjectId("518ee0bc9be1909012000002"), date: ISODate("2013-05-13T22:00:00Z"), patient:ObjectId("518ee0bc9be1909012000002") } 

io uso aggregato per ottenere risultati

 {date: ISODate("2013-05-13T22:00:00Z"), patients:[ObjectId("518ee0bc9be1909012000002"),ObjectId("518ee0bc9be1909012000002"),ObjectId("518ee0bc9be1909012000002")] } 

come questo

 Appointments.aggregate([ {$group: {_id: '$date', patients: {$push: '$patient'}}}, {$project: {date: '$_id', patients: 1, _id: 0}} ], ...) 

come posso popolare il documento del paziente provo questo ma non lavoro … Appointments.find({}).populate("patient").aggregate ….

in altre parole, posso usare popolare e aggregare nella stessa dichiarazione

qualsiasi aiuto per favore

Con l’ultima versione di mangusta (mangusta> = 3.6), è ansible ma richiede una seconda query e l’utilizzo di popola in modo diverso. Dopo la tua aggregazione, fai questo:

 Patients.populate(result, {path: "patient"}, callback); 

Maggiori informazioni sull’API Mongoose e sui documenti Mongoose .

È ansible utilizzare la ricerca $ che è simile a popolare.

In un esempio non correlato, utilizzo $ match per eseguire query per i record e $ seekup per popolare un modello esterno come sub-proprietà di questi record:

  Invite.aggregate( { $match: {interview: req.params.interview}}, { $lookup: {from: 'users', localField: 'email', foreignField: 'email', as: 'user'} } ).exec( function (err, invites) { if (err) { next(err); } res.json(invites); } ); 

Risposta breve: non puoi.

Risposta lunga: in Aggregation Framework, i campi restituiti vengono creati dall’utente e puoi “rinominare” le proprietà del documento.

Ciò significa che Mongoose non può identificare che i tuoi documenti di riferimento saranno disponibili nel risultato finale.

La cosa migliore che puoi fare in una situazione del genere è compilare il campo desiderato dopo che la query è stata restituita. Sì, ciò comporterebbe due chiamate DB, ma è ciò che MongoDB ci consente di fare.

Un po ‘come questo:

 Appointments.aggregate([ ... ], function( e, result ) { if ( e ) return; // You would probably have to do some loop here, as probably 'result' is array Patients.findOneById( result.patient, function( e, patient ) { if ( e ) return; result.patient = patient; }); }); 

Esegui un join con la ricerca $

Un ordine di ritiro contiene i seguenti documenti:

 { "_id" : 1, "item" : "abc", "price" : 12, "quantity" : 2 } { "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1 } { "_id" : 3 } 

Un altro inventario di raccolta contiene i seguenti documenti:

 { "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 } { "_id" : 2, "sku" : "def", description: "product 2", "instock" : 80 } { "_id" : 3, "sku" : "ijk", description: "product 3", "instock" : 60 } { "_id" : 4, "sku" : "jkl", description: "product 4", "instock" : 70 } { "_id" : 5, "sku": null, description: "Incomplete" } { "_id" : 6 } 

La seguente operazione di aggregazione sulla raccolta degli ordini unisce i documenti degli ordini con i documenti della collezione di inventario utilizzando l’elemento dei campi dalla raccolta ordini e il campo sku dalla raccolta di inventario:

 db.orders.aggregate([ { $lookup: { from: "inventory", localField: "item", foreignField: "sku", as: "inventory_docs" } } ]) 

L’operazione restituisce i seguenti documenti:

 { "_id" : 1, "item" : "abc", "price" : 12, "quantity" : 2, "inventory_docs" : [ { "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 } ] } { "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "inventory_docs" : [ { "_id" : 4, "sku" : "jkl", "description" : "product 4", "instock" : 70 } ] } { "_id" : 3, "inventory_docs" : [ { "_id" : 5, "sku" : null, "description" : "Incomplete" }, { "_id" : 6 } ] } 

Ricerca $ di riferimento

Puoi farlo in una query come questa:

 Appointments.aggregate([{ $group: { _id: '$date', patients: { $push: '$patient' } } }, { $project: { date: '$_id', patients: 1, _id: 0 } }, { $lookup: { from: "patients", localField: "patient", foreignField: "_id", as: "patient_doc" } } ]) 

popola fondamentalmente utilizza $ ricerca sotto il cofano. in questo caso non c’è bisogno di una seconda query. per maggiori dettagli controlla la ricerca di aggregazione MongoDB

inserisci la descrizione dell'immagine qui

 domain.Farm.aggregate({ $match: { "_id": mongoose.Types.ObjectId(farmId) } }, { $unwind: "$SelfAssessment" }, { $match: { "SelfAssessment.questionCategoryID": QuesCategoryId, "SelfAssessment.questionID": quesId } },function(err, docs) { var options = { path: 'SelfAssessment.actions', model: 'FarmAction' }; domain.Farm.populate(docs, options, function (err, projects) { callback(err,projects); }); }); 

risultati ho popolato il modello di azione

 { "error": false, "object": [ { "_id": "57750cf6197f0b5137d259a0", "createdAt": "2016-06-30T12:13:42.299Z", "updatedAt": "2016-06-30T12:13:42.299Z", "farmName": "abb", "userId": "57750ce2197f0b5137d2599e", "SelfAssessment": { "questionName": "Aquatic biodiversity", "questionID": "3kGTBsESPeYQoA8ae2Ocoy", "questionCategoryID": "5aBe7kuYWIEoyqWCWcAEe0", "question": "Waterways protected from nutrient runoff and stock access through fencing, buffer strips and off stream watering points", "questionImage": "http://images.contentful.com/vkfoa0gk73be/4pGLv16BziYYSe2ageCK04/6a04041ab3344ec18fb2ecaba3bb26d5/thumb1_home.png", "_id": "57750cf6197f0b5137d259a1", "actions": [ { "_id": "577512c6af3a87543932e675", "createdAt": "2016-06-30T12:38:30.314Z", "updatedAt": "2016-06-30T12:38:30.314Z", "__v": 0, "Evidence": [], "setReminder": "", "description": "sdsdsd", "priority": "High", "created": "2016-06-30T12:38:30.312Z", "actionTitle": "sdsd" } ], "answer": "Relevant" }, "locations": [] } ], "message": "", "extendedMessage": "", "timeStamp": 1467351827979 }