如何使用$ slice执行多个find()?

时间:2014-06-04 08:17:00

标签: c# mongodb mongodb-.net-driver mongodb-query

我需要提取许多文件的许多$ 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)组成。

1 个答案:

答案 0 :(得分:0)

我已经确定无法实现这一目标,而是必须在MongoDB上编写和解雇许多查询。

此外,由于数组很大,因此值得将此数据规范化为新的集合,但这确实会损害我的数据大小。