2013-09-29 19 views
11

Ho il seguente modello:mangusta distinti e popolare con i documenti

var followerSchema = new Schema({ 
    id_follower: {type: Schema.Types.ObjectId, ref: 'Users'}, 
    id_post: {type: Schema.Types.ObjectId, ref: 'Posts'} 
}); 

voglio essere in grado di trovare tutti i messaggi per una lista di seguaci. Quando utilizzo find, mi restituisce ovviamente più volte lo stesso post in quanto più utenti possono seguire lo stesso post.

Così ho provato a usare distinto, ma ho la sensazione che il "popolare" non funzioni in seguito.

Ecco il mio codice:

followerModel 
    .distinct('id_post',{id_follower:{$in:followerIds}}) 
    .populate('id_post') 
    .sort({'id_post.creationDate':1}) 
    .exec(function (err, postFollowers) { 
     console.log(postFollowers); 
    }) 

Mi restituisce solo la matrice dei posti, e non è popolata.

Sono nuovo di mongoDB, ma secondo la documentazione di mangusta, il metodo "distinto" dovrebbe restituire una query, proprio come il metodo "trova". E su una query puoi eseguire il metodo "populate", quindi non vedo cosa sto facendo male.

Ho anche cercato di utilizzare il metodo .distinct() della query, così allora il mio codice è simile a questo:

followerModel 
    .find({id_follower:{$in:followerIds}}) 
    .populate('id_post') 
    .distinct('id_post') 
    .sort({'id_post.creationDate':1}) 
    .exec(function (err, postFollowers) { 
     console.log(postFollowers); 
    }) 

In questo caso funziona, ma come nella documentazione di mangusta è necessario fornire una funzione di callback quando si utilizza il metodo distinto su una query, quindi nei miei registri ottengo errori dappertutto. Una soluzione alternativa sarebbe avere una funzione fittizia di callback, ma voglio evitare che ...

Qualcuno ha un'idea del perché il primo tentativo non funziona? E se il secondo approccio è accettabile fornendo un callback fittizio?

+0

Sembrerebbe non è supportato: https://github.com/LearnBoost/mongoose/issues/1549 – JohnnyHK

+0

Lei sembra avere ragione, invio distinti indietro una matrice di valori, non l'oggetto di richiedere (OID). Ma questo è (a mio parere) non ben documentato, in quanto il metodo "distinto" afferma di restituire un oggetto query, proprio come l'oggetto "trova". Grazie per il tuo tempo! –

risposta

5

Questo sarebbe il modo giusto considerando l'attuale mancanza di supporto in mangusta?

followerModel 
.find({id_follower:{$in:followerIds}}) 
.distinct('id_post',function(error,ids) { 
    Posts.find({'_id':{$in : ids}},function(err,result) { 
    console.log(result); 
    }); 
}); 
+0

È così che credo che lo farei anche io. –

Problemi correlati