2016-06-11 21 views
0

我想創建一個集合命令的集合:的MongoDB:如何創建由2場

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排序的字段,以便我可以在沒有排序子句的情況下檢索結果。

+0

的官方文檔*我想知道如何插入blockNumber,transactionIndex排序的字段,這樣我就可以在沒有排序子句的情況下檢索結果。* - 您不能。沒有廣告插入順序。如果你想排序,你需要使用'.sort()' – cdbajorin

回答

2

該查詢採用索引「from」,然後通過blockNumber和transactionIndex在內存中進行排序。 您必須創建一個由三個字段組成的索引。

ethTransactionSchema.index({ from:1, blockNumber: 1, transactionIndex: 1 }); 

編輯: 總的來說,如果你的查詢都是太慢,你必須看一看的解釋()命令。在mongoshell執行命令

EthTransaction.find({ from: 'address' }).sort({ blockNumber: 1, transactionIndex: 1 }).explain() 

通常在您的查詢的末尾添加expain()得到的數據是如何得到恢復的更多信息。請看explain()

+0

不可能插入由{blockNumber,transactionIndex}排序的字段? –

+0

如果您獲取所有結果,然後按blockNumber和transactionIndex進行排序,最後按'from'進行篩選,您可以使用已創建的第一個索引,但速度取決於2索引的基數。如果您無法通過描述哪種解決方案適合您的模式來創建新索引進行檢查。 –

+0

我可以創建一個新的索引,但真正的集合並不完全如此(還有一個字段也是),還有另一個查詢具有$或:[{blockNumber:{$ lt:lastBlockGot}},{$和:[{blockNumber:lastBlockGot},{transactionIndex:{$ lt:lastIndexGot}}]}]返回頁面結果。 –