sorting - 为什么我的 $sort Operator on dates 函数在我的查询中不一致?
问题描述
我正在尝试编写一个查询来根据降序日期排序文档...{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"
上面的结果也是想要的排序顺序。
也许下面的帮助代码可能会遮住一些光。
../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
format 并且应该看起来像ISODate("2019-02-11T02:37:05.000Z")
而不是String
format "2019-02-11 02:37:05"
。因此,如果客户端的排序也不起作用,请尝试paymentDate
将数据库中的保存Date
为String
.
推荐阅读
- c# - Pointing a function to another
- r - 组合具有不同列名的多个数据集
- .net - 'dotnet nuget push ...' 似乎没有推动符号
- c# - Azure 搜索 SearchParameters 对象引用未设置为对象错误的实例
- kubernetes - Multiple domains and SSL Certificates with GCP's kubernetes ingress
- heroku - How do I install FFMPEG inside Heroku?
- php - Laravel 应用程序中字符串索引引用的 PHP 数组的问题
- javascript - Cannot Find Module 'blueBird-lst' in Electron.js
- angular6 - Ionic4 Angular 属性指令无效
- python - 通过 python 在 MATLAB 中创建 tensorflow 会话