我需要提取许多文件的许多$ slice部分。
目前我看不到怎么做,所以我有一个并行循环,它为我提取这些数据,但是现在我想要一次回溯超过1000个节点,这不会成为性能,特别是MongoDB C Sharp驱动程序不支持异步查询。
这是(示例但类似的)结构:
{ TransactionId:BinData, 输出:[{Data:BinData},{Data:BinData}] }
我的代码目前单独获取,如下:
var outputs = new SpendableOutput[inputArray.Length];
Parallel.ForEach(inputArray, (input, s, i) =>
{
var transactionQuery = Transactions.Find(Query<TransactionInfo>.EQ(x => x.Hash, input.PrevTxHash))
.SetFields(new FieldsBuilder().Slice("o", (int)input.PrevTxOutputIndex, 1)
.Include("_id"));
var transaction = transactionQuery.ToArray();
if (transaction.Length != 0)
{
outputs[i] = new SpendableOutput
{
TxHash = inputArray[i].PrevTxHash,
Index = (int)inputArray[i].PrevTxOutputIndex,
Output = transaction[0].Outputs[0]
};
}
});
正如你所看到的,我正在查询交易集合,&#34; o&#34;字段,这是一个输出数组。从这里我想要一些输出。我意识到我可以根据列表中的_id请求所有事务,并在检索后输出输出,但是许多事务都有非常大的输出列表,我通常只需要一两个项目。
改善这种情况的第一种方法是从一个文档中获取许多切片,例如这样(不起作用)。
var transactionQuery = Transactions.Find(Query<TransactionInfo>.EQ(x => x.Hash, input.PrevTxHash))
.SetFields(new FieldsBuilder().Slice("o", itemNeededIndex1, 1)
.Slice("o", itemNeededIndex2, 1)
.Slice("o", itemNeededIndex3, 1).Include("_id"));
第二种方式(必须首选)是我发送一批查询&lt;&gt;对象,因为我有很多(通常超过1000个)事务对象(要检索相关的输出)。
是否有任何MongoDB查询专家可以提出实现这些目标的方法,或建议我没有想过的替代方法?
编辑:
父ID和子索引的来源是外部输入,用于定义清除特定余额可能需要的项目。它们具有Parent的ID和Child的索引。它由一个Byte数组(Parent Id / Hash)和int(Child Index)组成。
答案 0 :(得分:0)
我已经确定无法实现这一目标,而是必须在MongoDB上编写和解雇许多查询。
此外,由于数组很大,因此值得将此数据规范化为新的集合,但这确实会损害我的数据大小。