我想创建一个集合:
var ethTransactionSchema = new mongoose.Schema({
blockNumber: Number,
transactionIndex: Number,
from: String,
to: String,
data: String
});
我需要通过blockNumber,transactionIndex得到有序结果:当2个项目具有相同的blockNumber时,transactionIndex将定义订单。
我有一个索引:
ethTransactionSchema.index({ blockNumber: 1, transactionIndex: 1 }, { unique: true });
ethTransactionSchema.index({ from: 1 });
执行查询时:
EthTransaction.find({ from: 'address' }).sort({ blockNumber: 1, transactionIndex: 1 }).limit(20)
和另一个问题:
EthTransaction.find(
{
$and: [
{
$or: [ { from: 'address1' }, { to: 'address2' } ]
},
{
$or: [{ blockNumber: { $gt: lastBlockGot } }, { $and: [{ blockNumber: lastBlockGot }, { transactionIndex: { $gt: lastIndexGot } }] }]
}]
}
).sort({ blockNumber: 1, transactionIndex: 1 }).limit(20)
我工作得很完美,但速度太慢。我想知道如何插入blockNumber,transactionIndex排序的字段,这样我就可以在没有sort子句的情况下检索结果。
答案 0 :(得分:2)
查询从"中获取索引"然后按blockNumber和transactionIndex在内存中排序。 您必须创建由三个字段组成的索引。
ethTransactionSchema.index({ from:1, blockNumber: 1, transactionIndex: 1 });
编辑: 通常,如果您的查询太慢,则必须查看explain()命令。在mongoshell中执行命令
EthTransaction.find({ from: 'address' }).sort({ blockNumber: 1, transactionIndex: 1 }).explain()
通常在查询结束时添加expain()
以获取有关如何恢复数据的更多信息。另请查看explain()