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

C# 如何使用$slice执行多个find()?,c#,mongodb,mongodb-.net-driver,mongodb-query,C#,Mongodb,Mongodb .net Driver,Mongodb Query,我需要从许多文档中提取许多$slice部分 目前我不知道如何处理,所以我有一个并行循环来为我提取这些数据,但是现在我想一次检索1000多个节点,这并没有提高性能,特别是因为MongoDB C Sharp驱动程序不支持异步查询 这是(示例但类似)结构: { 事务ID:BinData, 输出:[{Data:BinData},{Data:BinData}] } 目前,我的代码将分别获取每一个,如下所示: var outputs = new SpendableOutput[inputArray.Leng

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

目前我不知道如何处理,所以我有一个并行循环来为我提取这些数据,但是现在我想一次检索1000多个节点,这并没有提高性能,特别是因为MongoDB C Sharp驱动程序不支持异步查询

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

{ 事务ID: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]
        };
    }
});
var outputs=新的SpendableOutput[inputArray.Length];
Parallel.ForEach(输入阵列,(输入,s,i)=>
{
var transactionQuery=Transactions.Find(Query.EQ(x=>x.Hash,input.PrevTxHash))
.SetFields(新的FieldsBuilder().Slice(“o”,(int)input.PrevTxOutputIndex,1)
。包括(“_id”);
var transaction=transactionQuery.ToArray();
if(transaction.Length!=0)
{
输出[i]=新的可消费输出
{
TxHash=输入阵列[i]。PrevTxHash,
索引=(int)inputArray[i]。PrevTxOutputIndex,
输出=事务[0]。输出[0]
};
}
});
如您所见,我正在查询事务集合“o”字段,这是一个输出数组。从这里我想要一些输出。我意识到我可以根据列表中的_id请求所有事务,并在检索到输出后将其取出,但许多事务都有非常大的输出列表,我通常只需要一到两项

改进这一点的第一种方法是从一个文档中获取多个切片,例如这个(不起作用)

var transactionQuery=Transactions.Find(Query.EQ(x=>x.Hash,input.PrevTxHash))
.SetFields(新的FieldsBuilder().Slice(“o”,ItemNeededIndex 1,1)
.切片(“o”,项目需要索引2,1)
.Slice(“o”,itemNeededIndex3,1)。包括(“_id”);
第二种方法(必须优先)是我发送一批查询对象,因为我有许多(通常超过1000个)事务对象(要检索关联的输出)

是否有任何MongoDB查询专家可以提出实现这些目标的方法,或者提出我从未想过的替代方法

编辑:


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

我已经确定没有办法实现这一点,相反,必须在MongoDB上创建并触发许多查询


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

如何知道要切片哪些元素?是否存在与所需元素匹配的查询条件?这是否会因事务而异,或者是否有一些设置的流程或规则根据其他字段确定这一点?如果您假定这是父子关系。我正在寻找许多孩子,有家长Id和孩子的索引。我正在寻找一种方法,在一次mongo通话中获得所有这些记录。一个家长可能要检索多个子项。这一部分我理解。我的问题是如何知道要从数组中切片哪些索引值?例如,什么决定了索引2、5、7?我最初评论的其他部分是从中引出的问题。我通常是说,你的问题可以编辑,以澄清你的过程和目的。通常情况下,当您没有收到答案,并且希望引起对您的问题的注意时,会出现这种情况。有一个外部过程提供这些值。我只想返回我需要的数组项,这些项可能不是连续的索引。我想在一次操作中完成此操作,但我不想将整个父对象拉回来,因为它可能太大。当然。但是如果你理解我的意思,这里的用法很奇怪。Slice按预期用途实现,比如最后三项、前三项等。您需要特定的索引。那一定是从什么地方来的。你能改为匹配这些值吗?这里的
BinData
是什么?UUID或GUID?这些是我澄清你的问题的意思。我帮助提出其他可能的解决方案。
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"));