diff options
Diffstat (limited to 'src/mongo/db/exec/inclusion_projection_executor.h')
| -rw-r--r-- | src/mongo/db/exec/inclusion_projection_executor.h | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/src/mongo/db/exec/inclusion_projection_executor.h b/src/mongo/db/exec/inclusion_projection_executor.h index aef4c07b434..7f505f54797 100644 --- a/src/mongo/db/exec/inclusion_projection_executor.h +++ b/src/mongo/db/exec/inclusion_projection_executor.h @@ -173,19 +173,24 @@ private: */ class InclusionProjectionExecutor : public ProjectionExecutor { public: - InclusionProjectionExecutor(const boost::intrusive_ptr<ExpressionContext>& expCtx, - ProjectionPolicies policies, - std::unique_ptr<InclusionNode> root) - : ProjectionExecutor(expCtx, policies), _root(std::move(root)) {} - - InclusionProjectionExecutor(const boost::intrusive_ptr<ExpressionContext>& expCtx, - ProjectionPolicies policies, - bool allowFastPath = false) + InclusionProjectionExecutor( + const boost::intrusive_ptr<ExpressionContext>& expCtx, + ProjectionPolicies policies, + std::unique_ptr<InclusionNode> root, + boost::optional<projection_ast::ProjectionPathASTNode> proj = boost::none) + : ProjectionExecutor(expCtx, policies, proj), _root(std::move(root)) {} + + InclusionProjectionExecutor( + const boost::intrusive_ptr<ExpressionContext>& expCtx, + ProjectionPolicies policies, + bool allowFastPath = false, + boost::optional<projection_ast::ProjectionPathASTNode> proj = boost::none) : InclusionProjectionExecutor( expCtx, policies, allowFastPath ? std::make_unique<FastPathEligibleInclusionNode>(policies) - : std::make_unique<InclusionNode>(policies)) {} + : std::make_unique<InclusionNode>(policies), + proj) {} TransformerType getType() const final { return TransformerType::kInclusionProjection; @@ -202,16 +207,17 @@ public: /** * Serialize the projection. */ - Document serializeTransformation( - boost::optional<ExplainOptions::Verbosity> explain) const final { + Document serializeTransformation(boost::optional<ExplainOptions::Verbosity> explain, + const SerializationOptions& options = {}) const final { MutableDocument output; // The InclusionNode tree in '_root' will always have a top-level _id node if _id is to be // included. If the _id node is not present, then explicitly set {_id: false} to avoid // ambiguity in the expected behavior of the serialized projection. - _root->serialize(explain, &output); - if (output.peek()["_id"].missing()) { - output.addField("_id", Value{false}); + _root->serialize(explain, &output, options); + auto idFieldName = options.serializeFieldPath("_id"); + if (output.peek()[idFieldName].missing()) { + output.addField(idFieldName, Value{false}); } return output.freeze(); |
