From 509199b32dc34f302e1d188a9b35bf7e3a4bd017 Mon Sep 17 00:00:00 2001 From: Mathias Stearn Date: Mon, 29 Oct 2012 14:33:34 -0400 Subject: SERVER-7491: Correctly generate projections for subfields of _id This requires special casing due to SERVER-7502 --- src/mongo/db/pipeline/document_source.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'src/mongo/db/pipeline/document_source.cpp') diff --git a/src/mongo/db/pipeline/document_source.cpp b/src/mongo/db/pipeline/document_source.cpp index e1f033192a9..a459ec0ad10 100755 --- a/src/mongo/db/pipeline/document_source.cpp +++ b/src/mongo/db/pipeline/document_source.cpp @@ -87,11 +87,16 @@ namespace mongo { BSONObj DocumentSource::depsToProjection(const set& deps) { BSONObjBuilder bb; - if (deps.count("_id") == 0) - bb.append("_id", 0); + + bool needId = false; string last; for (set::const_iterator it(deps.begin()), end(deps.end()); it!=end; ++it) { + if (str::startsWith(*it, "_id") && (it->size() == 3 || (*it)[3] == '.')) { + // _id and subfields are handled specially due in part to SERVER-7502 + needId = true; + continue; + } if (!last.empty() && str::startsWith(*it, last)) { // we are including a parent of *it so we don't need to // include this field explicitly. In fact, due to @@ -102,6 +107,12 @@ namespace mongo { last = *it + '.'; bb.append(*it, 1); } + + if (needId) // we are explicit either way + bb.append("_id", 1); + else + bb.append("_id", 0); + return bb.obj(); } } -- cgit v1.2.1