2016-03-22 2 views
0

Предположим, что я есть две следующие схемы:Mongoose - Удалить дубликаты из результатов запроса

var SchemaOne = new mongoose.Schema({ 
    created_at: { type: Date }, 
    schemaTwo: { type: mongoose.Schema.Types.ObjectId, ref: 'SchemaTwo' }, 
    ancestor: { type: mongoose.Schema.Types.ObjectId, ref: 'SchemaOne' } 
}); 

var SchemaTwo = new mongoose.Schema({ 
    headline: { type: String, required: true } 
}); 

То, что я хотел бы сделать: для каждого SchemaOne документа с тем же предка, как один при условии, возвращающие SchemaTwo «ю.ш. заголовок, к которому они привязаны (если есть), принимая во внимание, что результаты запроса не должны возвращать дубликаты и должны быть ограничены 15 результатами, отсортированными по убыванию SchemaOnecreated_at.

Я начал делать следующее:

SchemaOne 
    .find({ 'ancestor': ancestor }) 
    .sort({ 'created_at': -1 }) 
    .populate({ path: 'schemaTwo', select: 'headline', options: { limit: 15 } }) 
    .exec(function(err, docs) { 
    // do something with the results 
    }); 

Но, делая это, я все еще получаю дублирующиеся результаты, то есть, у меня будет несколько SchemaOne документов, связанных с тем же SchemaTwo документа.

Можете ли вы мне помочь, как это решить?

ответ

1

Используя mongoose aggregate метод и async библиотеку, мне удалось заставить его работать так, как я хочу, и нужно:

SchemaOne.aggregate([ 
    { $match: { $and: [{'ancestor': ancestor }, { 'schemaTwo': { $exists: true } }] } }, 
    { $group: { _id: '$schemaTwo' } }, 
    { $limit: 15 }, 
    { $sort : { 'created_at': -1 } } 
], 
function(err, results) { 
    // do something with err 

    async.map(results, function(doc, callback) { 
    SchemaTwo.findById(doc, function(err, result) { 
     if(err) { return callback(err, null); } 
     return callback(null, result); 
    }); 
    }, function(err, docs) { 
    // do something with err 

    // here I have my results the way I want 
    }); 
}); 
+0

Как это выполнить, когда вы делаете первый агрегат с последующим контуром findById? Вы все еще используете это или улучшаете это? – runios

Смежные вопросы