Почему мой оператор $ sort на датах не работает в моем запросе? - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь написать запрос для сортировки документов по убыванию дат ...{sort: {paymentDate: -1 }}.При первом запуске запроса секция запроса {sort: {paymentDate: -1 }} кажется игнорируемой!Однако когда я обновляю страницу в браузере, применяется раздел запроса {sort: {paymentDate: -1 }}, и запрос отображается в правильном порядке sort .

Мне нужно знать, как исправить эту проблему!

Найти под содержимым моего документа после выполнения запроса recipientsDetails.find().fetch(); в консоли браузера:

0:
payersUserId: "hbieZBFNE53GpE8LP"
paymentDate: "2019-02-11 02:37:05"
payersNumber: "+25478887633"
paymentStatus: "Failed"
recipientNumber: "+25478887633"
_id: "eFShDRzp9JM9ejG5S"

1:
payersUserId: "hbieZBFNE53GpE8LP"
paymentDate: "2019-02-08 16:02:25"
payersNumber: "+2547078887633"
paymentStatus: "Failed"
recipientNumber: "+25478887633"
_id: "SnpNwsx49mZfPNSg7"

2:
payersUserId: "hbieZBFNE53GpE8LP"
paymentDate: "2019-02-08 15:00:02"
payersNumber: "+254707888633"
paymentStatus: "Failed"
recipientNumber: "+25478087703"
_id: "ZHWSiRBYk2xoZvDzb"

Приведенные выше результаты также являются желаемым отсортированным порядком.

Возможно, приведенный ниже код helper может затенить некоторый свет.

.. / client / main.js

Template.paymentB2C.helpers({

'enableButton': function () {

    var enableButtonStatusArray = [];   
    var userIdCode = Meteor.userId(); 
    var phoneNumber = Meteor.users.findOne({_id: userIdCode }, { fields: { "profile.telephoneNumber": 1 } } ); 
    var usersPhoneNumber = phoneNumber.profile.telephoneNumber; 

    var selectedRecipientDetails = recipientsDetails.find( { $or: [ { payersNumber: usersPhoneNumber }, { recipientNumber: usersPhoneNumber } ] }, 

                                            { fields: { 
                                                        "payersUserId": 1,
                                                        "paymentDate": 1,
                                                        "paymentStatus": 1,
                                                        "_id": 1

                                            } }).fetch();


         selectedRecipientDetails.forEach((user) => {
                    payersUserId = user.payersUserId;
                    paymentDate = user.paymentDate;
                    paymentStatus = user.paymentStatus;
                    _id = user._id;

                if(paymentStatus === "Failed"){

                        enableButtonStatusArray.push({ 
                            paymentStatus: paymentStatus,
                            paymentDate: paymentDate,
                            _id: _id
                            });

                    }

            else if(paymentStatus === "Passed"){

                        enableButtonStatusArray.push({ 
                            paymentStatus: paymentStatus,
                            paymentDate: paymentDate,
                            _id: _id});

                   }

            Session.set('enableButtonStatusArray2', enableButtonStatusArray );

        });

    var enableButtonStatusArrayForPrint = Session.get('enableButtonStatusArray2');

return enableButtonStatusArrayForPrint;

}


});

Обратите внимание, что в данном запросе отсутствует функция ...{sort: {paymentDate: -1 }}.

Найдите код ниже Router:

.. / client / main.js

Router.route('/paymentB2C', {
name: 'paymentB2C',  
template: 'paymentB2C',

    waitOn: function(){

       return Meteor.subscribe('pendingPayments')

    }

});

Это приводит к моей Meteor.subscribe('pendingPayments') функции публикации:

.. / server / main.js

Meteor.publish('pendingPayments', function pendingPayments(){

   return recipientsDetails.find({}, {sort: {paymentDate: -1 }});

});

Обратите внимание, что здесь у меня есть функция sort.

Может кто-нибудь объяснить, почему при первом запуске кода sort игнорируется иДокумент сортируется случайным образом, однако после нажатия кнопки «Обновить» в браузере он сортируется как задумано (правильно)?

С нетерпением ждем вашей помощи.

1 Ответ

0 голосов
/ 12 февраля 2019

В идеале вы должны отсортировать данные в запросе на стороне клиента после подписки, а не сортировать их в методе публикации.

Причина в том, что если клиент подписывается на более чем одну функцию публикации, котораябудет публиковать данные из тех же коллекций, ваш запрос find на стороне клиента будет иметь доступ к данным как из публикации, так и из сортировки будет неэффективным.Более того, публикация - это то, что предоставляет подписчику доступ к данным, и если мини-монго на стороне клиента уже имеет данные, оно не будет синхронизировать данные, пока не поступят новые данные.

Следовательно, вам следуетвсегда выполняйте сортировку и фильтрацию в ваших find запросах на стороне клиента.

Кроме того, я замечаю, что формат поля paymentDate не является датой.В идеале он должен иметь формат Date и выглядеть примерно так: ISODate("2019-02-11T02:37:05.000Z") вместо String формата "2019-02-11 02:37:05".Поэтому, если сортировка на стороне клиента также не работает, попробуйте сохранить paymentDate в базе данных как Date вместо String.

...