为什么我的日期上的$ sort运算符在查询中不一致?

时间:2019-02-11 12:15:47

标签: sorting meteor mongodb-query

我正在尝试编写一个查询,以根据降序的...{sort: {paymentDate: -1 }}顺序对文档进行排序。第一次运行查询时,查询部分{sort: {paymentDate: -1 }}似乎被忽略了! 但是,当我在浏览器中刷新页面时,将应用查询部分 {sort: {paymentDate: -1 }},查询将以正确的排序顺序显示。

我需要知道如何解决此问题!

在浏览器控制台中运行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 :(得分:1)

理想情况下,您应在订阅后对客户端查询中的数据进行排序,而不是在publish方法中进行排序。

原因是,如果客户端预订了多个发布功能,这些功能将发布来自相同集合的数据,那么您在客户端的find查询将可以访问发布和发布中的数据排序将无效。此外,发布是一种向订户授予数据访问权限的方法,如果客户端上的mini-mongo已经具有数据,则除非新数据到达,否则它不会同步数据。

因此,您也应该始终在客户端的find查询中进行排序和过滤。

此外,我注意到paymentDate字段的格式不是“日期”。理想情况下,它应为Date格式,并且外观应类似于ISODate("2019-02-11T02:37:05.000Z"),而不是String格式"2019-02-11 02:37:05"。因此,如果客户端的排序也不起作用,请尝试将paymentDate在数据库中另存为Date,而不是String