У меня есть требование вытащить MANY $ slice части МНОГО документов.
На данный момент я не вижу, как это сделать, поэтому у меня есть параллельная петля, которая извлекает эти данные для меня, однако теперь я хочу получить более 1000 узлов за раз, и это не становится производительностью, особенно, поскольку MongoDB C Драйвер Sharp не поддерживает запросы Async.
Это (пример, но аналогичная) структура:
{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]
};
}
});
Как вы можете видеть, я запрашиваю коллекцию транзакций "o", которая представляет собой массив выходных данных. Из этого я хочу несколько выходов. Я понимаю, что могу попросить все транзакции, основанные на том, что _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 обычно) объектов Transaction (с соответствующими выводами для извлечения).
Есть ли какой-либо эксперт по запросу MongoDB, который мог бы предложить подход к их достижению или предложить альтернативный подход, о котором я не думал?
РЕДАКТИРОВАТЬ:
Источником идентификатора родителя и индекса ребенка является внешний ввод, который определяет, какие элементы могут потребоваться для очистки определенного баланса. У них есть идентификатор родителя и индекс ребенка. Он состоит из массива байт-массива (родительский идентификатор/хэш) и int (индекс ребенка).
Я решил, что этого не может быть, вместо этого в MongoDB должно быть много запросов и выпущено.
Кроме того, поскольку массивы являются большими, стоит нормализовать эти данные в новую коллекцию, однако это повредит размер моих данных.