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

本文关键字:find 执行 何使用 slice | 更新日期: 2023-09-27 18:06:41

我需要从许多文档中提取许多$slice部分。

目前我看不到如何处理,所以我有一个并行循环,它为我拉这些数据,但现在我想一次检索超过1000个节点,这不是成为性能,特别是MongoDB C夏普驱动程序不支持异步查询。

这是(类似的示例)结构:

{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]
        };
    }
});

如您所见,我正在查询Transactions集合"o"字段,它是一个output数组。从这里我想要一些输出。我意识到我可以根据我的列表中的_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"));

第二种方式(必须首选)是我发送一批Query<>对象,因为我有许多(通常超过1000)事务对象(具有相关的输出来检索)。

是否有任何MongoDB查询专家,可以建议一种方法来实现这些,或者建议一种替代方法,我没有想过?

编辑:

父ID和子索引的来源是一个外部输入,它定义了清除特定余额可能需要哪些项目。它们只有父节点的ID和子节点的索引。它由字节数组(父Id/哈希)和int(子索引)组成。

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

我已经确定没有办法实现这一点,相反,必须有许多查询组成并在MongoDB启动。

另外,因为数组很大,所以值得将这些数据规范化为一个新的集合,但是这会影响我的数据大小。