BSONObj ResolvedViewDefinition::asExpandedViewAggregation(const AggregationRequest& request) { BSONObjBuilder aggregationBuilder; // Perform the aggregation on the resolved namespace. aggregationBuilder.append("aggregate", collectionNss.coll()); // The new pipeline consists of two parts: first, 'pipeline' in this ResolvedViewDefinition; // then, the pipeline in 'request'. BSONArrayBuilder pipelineBuilder(aggregationBuilder.subarrayStart("pipeline")); for (auto&& item : pipeline) { pipelineBuilder.append(item); } for (auto&& item : request.getPipeline()) { pipelineBuilder.append(item); } pipelineBuilder.doneFast(); // The cursor option is always specified regardless of the presence of batchSize. if (request.getBatchSize()) { BSONObjBuilder batchSizeBuilder(aggregationBuilder.subobjStart("cursor")); batchSizeBuilder.append(AggregationRequest::kBatchSizeName, *request.getBatchSize()); batchSizeBuilder.doneFast(); } else { aggregationBuilder.append("cursor", BSONObj()); } if (request.isExplain()) aggregationBuilder.append("explain", true); return aggregationBuilder.obj(); }
ExpressionContext::ExpressionContext(OperationContext* opCtx, const AggregationRequest& request, std::unique_ptr<CollatorInterface> collator, StringMap<ResolvedNamespace> resolvedNamespaces) : isExplain(request.isExplain()), inShard(request.isFromRouter()), extSortAllowed(request.shouldAllowDiskUse()), bypassDocumentValidation(request.shouldBypassDocumentValidation()), ns(request.getNamespaceString()), opCtx(opCtx), collation(request.getCollation()), _collator(std::move(collator)), _documentComparator(_collator.get()), _valueComparator(_collator.get()), _resolvedNamespaces(std::move(resolvedNamespaces)) {}