【问题标题】:How to perform multiple find() with $slice?如何使用 $slice 执行多个 find()?
【发布时间】:2014-06-04 08:17:00
【问题描述】:

我需要提取 MANY 文档的 MANY $slice 部分。

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

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

{ TransactionId:BinData, 输出:[{数据:BinData},{数据: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”字段,它是一个 Outputs 数组。从这里我想要一些输出。我意识到我可以根据列表中的 _id 请求所有交易,并在检索到输出后将其取出,但许多交易都有非常大的输出列表,我通常只需要其中的一两个项目。

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

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 个)Transaction 对象(以及要检索的相关输出)。

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

编辑:

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

【问题讨论】:

  • 你怎么知道你想切片哪些元素?是否有一些与您想要的元素匹配的查询条件?这会因交易而异,还是有一些设定的流程或规则根据其他字段确定这一点?
  • 如果您假设它是父子关系。我正在寻找许多孩子,拥有家长 ID 和孩子的索引。我正在寻找一种在一次 mongo 调用中获取所有这些记录的方法。 Parent 可能有多个 Child 要检索。
  • 我明白那部分。我的问题是您如何知道要切片的数组中的哪些索引值?例如,什么决定了索引 2、5、7?我原始评论的其他部分是由此引发的问题。我一般说可以编辑您的问题以阐明您的流程和目的。当您没有收到答案并希望引起对您的问题的关注时,通常会出现这种情况。
  • 有一个外部进程提供这些值。我只是希望只返回我需要的数组项,这些项可能不是连续的索引。我想在一次操作中执行此操作,但我不想将整个父级拉回来,因为它可能太大了。
  • 当然。但如果你理解我的意思,这里的用法很奇怪。 Slice 按其预期用途实现,例如最后三个项目、前三个项目等。您要求特定索引。那必须来自某个地方。你能改为匹配这些值吗?这里的BinData 是什么? UUID 还是 GUID?这些是我要澄清你的问题的意思。我帮助提出其他可能的解决方案。

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


【解决方案1】:

我已经确定没有办法实现这一点,而是必须在 MongoDB 上编写和触发许多查询。

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

【讨论】:

    猜你喜欢
    • 2014-02-12
    • 2019-12-05
    • 2018-07-15
    • 2018-09-21
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    相关资源
    最近更新 更多