Я использую агрегатную функцию для группировки всех своих элементов, но я понятия не имею, как выполнить замену корня для них. Я не нашел его в документации mongoose, поддерживает ли mongoose его. Ниже мой код.
var MessageODM = mongoose.model('message', new Message());
exports.save = function (message, callback) {
new MessageODM(message).save();
};
exports.getUnreadChat = function (user, callback) {
MessageODM().aggregate([
{
$match: { 'receiver.email': user.email}
}])
.sort({ dateCreated: 'desc'})
.group({ _id: { sender: '$sender', receiver: '$receiver' },children: {$push: '$$ROOT'} })]
.exec(callback);
};
Я пытаюсь заменить значение детей первым в индексе.
в моей статистической функции я написал для Java, я достиг этого
MatchOperation matchOperation = match(
Criteria.where("receiver.email").is(receiver.getEmail())
.andOperator(Criteria.where("isRead").is(false)));
SortOperation sortOperation = new SortOperation(new Sort(Sort.Direction.DESC,"dateCreated"));
GroupOperation groupOperation = group("sender","receiver").push("$$ROOT").as("children");
AggregationOperation replaceRoot = Aggregation.replaceRoot().withValueOf(ArrayOperators.ArrayElemAt.arrayOf("children").elementAt(0));
Aggregation aggregation = newAggregation(matchOperation, sortOperation, groupOperation,replaceRoot);
AggregationResults<Message> result = mongoTemplate.aggregate(aggregation,"message", Message.class);
return result.getMappedResults();
while и альтернатива для чистого mongDb будут выглядеть так:
db.getCollection('contentSource').aggregate( [ { $sort: { "modified": -1 } },
{ $group: { _id: "$sourceId", cs: { $push: "$$ROOT" } }},
{ $replaceRoot: { newRoot: { $arrayElemAt: ['$cs', 0] } }} ] )