문제

많은 문서의 많은 $ 슬라이스 부분을 끌어 올리기위한 요구 사항이 있습니다.

어떻게 해야하는지 알 수 없으므로이 데이터를 가져 오는 병렬 루프가 있습니다. 그러나 이제는 한 번에 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]
        };
    }
});
.

보시다시피, 출력 배열 인 트랜잭션 컬렉션 "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"));
.

둘째로 (선호해야 함) <> 객체의 일괄 처리 <> 객체의 일괄 처리 (1,000 개가 넘는 일반적으로 검색 할 연관된 출력)가 있습니다.

이들을 달성하기위한 접근 방식을 제안 할 수있는 몽고브 쿼리 전문가가 있습니까?

에 대해 생각하지 않은 대체 접근법을 제안하십시오.

편집 :

상위 ID 및 하위 인덱스의 소스는 특정 잔액을 지울 수 있도록 어떤 항목을 필요로 할 수있는 항목을 정의하는 외부 입력입니다. 그들은 부모의 ID와 자식의 색인 만 있습니다. 이것은 바이트 배열 (상위 ID / 해시) 및 int (하위 인덱스)의 배열로 구성됩니다.

도움이 되었습니까?

해결책

나는 이것을 달성 할 수있는 방법이 없다는 것을 결정했다. 대신에 몽고브에서 구성되고 해고 된 많은 질의가 있어야한다.

또한 어레이가 큰이 데이터를 새 컬렉션으로 정규화하는 것이 가치가 없으므로 데이터 크기가 상처를줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top