据我所知,似乎无法在不使用const Discord = require('discord.js');
const sqlite = require('sqlite3').verbose();
const db = new sqlite.Database('./mbot.db', (err) => {
if (err) console.log(err.message);
});
module.exports = {
name: 'leaderboard',
description: 'Get up to 50 users with the most points',
async execute(message, args, client) {
const leaders = await leaderboard(message, client);
let page = 0;
message.channel.send(leaders[page]).then(async sent => {
await sent.react('◀');
await sent.react('▶');
sent.awaitReactions((reaction, user) => {
if (user.id === client.user.id) return;
reaction.remove(user);
switch (reaction.emoji.name) {
case "◀":
if (page === 0) return;
page--;
break;
case "▶":
if (page === leaders.length - 1) return;
page++;
break;
}
sent.edit(leaders[page]);
}, (2 * 60000));
});
},
};
function leaderboard(message, client) {
return new Promise((resolve) => {
db.all('SELECT points points, id id FROM users ORDER BY points DESC', async (err, rows) => {
if (err) return console.log(err);
const embeds = [];
if (!rows.length) return message.channel.send('No users found!');
const each = new Promise(async (resolve) => {
const users = [];
rows.forEach((val, i, arr) => {
users.push({
id: arr[i].id,
points: arr[i].points,
});
});
return resolve(users);
});
await each.then(async users => {
let method = Math.floor(users.length / 10) - 1;
for (let i = -1; i < method; i++) {
embeds.push(new Discord.RichEmbed());
method = Math.floor(users.length / 10);
}
let multiplier = 1;
for (let i = 0; i < 10 * multiplier; i++) {
if (i === 50) {
break;
}
if (users[i]) {
const user = await client.fetchUser(users[i].id);
embeds[multiplier - 1].addField(`${i + 1}. ${user.username}`, users[i].points, true);
if (i === (10 * multiplier) - 1) {
multiplier++;
}
}
}
});
return resolve(embeds);
});
});
}
或Find
的情况下在执行日期lte
的MongoDB中执行Date
查找JavaScript构造函数方法。
我使用的技术堆栈使用ISODate
脚本,这些脚本由辅助LUA
系统调用。问题是我只能在这些系统之间传递纯JSON,然后再传递给MongoDB实例本身。
这带来了许多问题,主要的问题是Mongo支持的任何JavaScript函数都不是可选项。 (假设没有办法让Mongo解释存储在字符串值中的函数?)
目前,我可以使用Perl
方法执行lte
查找,如下所示:
Aggregate
虽然这行得通,但这仅用于一次日期比较,因为我希望创建一些相当复杂的查询,所以能够减少代码量将是一个很好的选择。
理想情况下,我可以使用{
"$match": {
"$expr": {
"$and": {
"$lte": {
"start_date": {
"$dateFromString": {
"dateString": "2020-06-07T04:44:39.993Z"
}
}
}
}
}
}
}
并执行以下操作:
Find
据我所知{
"start_date": {
"$lte": "2020-06-07T04:44:39.993Z"
}
}
似乎不支持使用基于字符串的Date值的Find
日期查询。
我尝试过的事情:
我尽一切努力吗?是否可以选择使用纯JSON?还是我不得不承认失败并使用lte
函数执行String到Date的转换,并处理其他样板代码,或者Mongo是否缺少我可以做的基本事情?这个吗?