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



我正在尝试编写一个查询,以根据降序...{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函数的地方。

有人能解释为什么当代码第一次运行时,排序被忽略,文档被随机排序,但在浏览器中点击刷新后却按设计(正确)排序吗?

期待您的帮助。

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

原因是,如果客户端订阅了多个发布函数,这些函数将发布来自同一集合的数据,则客户端中的find查询将可以访问来自发布和排序的数据。这将无效。此外,发布是向订阅者授予数据访问权限的东西,如果客户端的mini-mongo已经拥有数据,那么除非有新的数据到达,否则它不会同步数据。

因此,您应该始终在客户端对find查询进行排序和筛选。

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

最新更新