Как выполнить несколько find () с $ slice?

1

У меня есть требование вытащить 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-query
mongodb-.net-driver

1 ответ

0
Лучший ответ

Я решил, что этого не может быть, вместо этого в MongoDB должно быть много запросов и выпущено.

Кроме того, поскольку массивы являются большими, стоит нормализовать эти данные в новую коллекцию, однако это повредит размер моих данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню