仅使用JSON与MongoDB Find执行日期比较

时间:2019-06-09 22:11:34

标签: mongodb

据我所知,似乎无法在不使用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日期查询。

我尝试过的事情:

  • 使用各种ISO和JavaScript格式化的日期字符串。
  • 使用纪元秒和毫秒字符串值。
  • 尝试在字符串值内转义JavaScript函数调用。

我尽一切努力吗?是否可以选择使用纯JSON?还是我不得不承认失败并使用lte函数执行String到Date的转换,并处理其他样板代码,或者Mongo是否缺少我可以做的基本事情?这个吗?

0 个答案:

没有答案