Как я могу добавить $ replaceroot в мою функцию aggregate.group - PullRequest
0 голосов
/ 22 января 2019

Я использую агрегатную функцию для группировки всех своих элементов, но я понятия не имею, как выполнить замену корня для них. Я не нашел его в документации 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] } }} ] )

1 Ответ

0 голосов
/ 22 января 2019

Вы можете использовать mongoose очень похоже на обычные агрегаты mongoDB:

MessageODM().aggregate([
    {   $match: { 'receiver.email': user.email} },
    {   $sort: {dateCreated: -1} },
    {   $group: { 
           _id: { 
             sender: '$sender', 
             receiver: '$receiver' 
           },
           children: {$push: '$$ROOT'}  
    },
    { $replaceRoot: { newRoot: { $arrayElemAt: ['$children', 0] } }},
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...