Details
Description
A mongos will return an empty result set on any pipeline with a $documents stage like this one:
db.aggregate([{$documents: [{_id: 1}, {_id: 2}]}]);
|
I believe this is due to this logic:
// If the routing table is valid, we obtain a reference to it. If the table is not valid, then |
// either the database does not exist, or there are no shards in the cluster. In the latter |
// case, we always return an empty cursor. In the former case, if the requested aggregation is a |
// $changeStream, we allow the operation to continue so that stream cursors can be established |
// on the given namespace before the database or collection is actually created. If the database |
// does not exist and this is not a $changeStream, then we return an empty cursor. |
boost::optional<ChunkManager> cm;
|
auto executionNsRoutingInfoStatus =
|
sharded_agg_helpers::getExecutionNsRoutingInfo(opCtx, namespaces.executionNss);
|
|
if (!executionNsRoutingInfoStatus.isOK()) { |
if (liteParsedPipeline.startsWithCollStats()) { |
uassertStatusOKWithContext(executionNsRoutingInfoStatus,
|
"Unable to retrieve information for $collStats stage"); |
}
|
}
|
|
if (executionNsRoutingInfoStatus.isOK()) { |
cm = std::move(executionNsRoutingInfoStatus.getValue());
|
} else if (!(hasChangeStream && |
executionNsRoutingInfoStatus == ErrorCodes::NamespaceNotFound)) {
|
appendEmptyResultSetWithStatus(
|
opCtx, namespaces.requestedNss, executionNsRoutingInfoStatus.getStatus(), result);
|
return Status::OK(); |
}
|
This is a behavioral difference from a replica set, and can make writing tests annoying (discovered in SERVER-63793).
The new, requested behavior is to allow the operation to continue even if the db doesn't exist for $documents. Similar to how $changeStreams is handled, it may be the case that special support/case handling will have to be added to support $documents if current agg implementation isn't prepared to handle the db not existing.
Attachments
Issue Links
- is related to
-
SERVER-63793 Add test demonstrating behavior of $setWindowField's 'output' parameter
-
- Closed
-
- related to
-
SERVER-69836 mongos doesn't raise validation errors but returns empty cursors when the database doesn't exist
-
- Open
-
-
SERVER-70176 $documents sharding tests runs on versions before 5.1
-
- Closed
-