-
Type: Bug
-
Resolution: Fixed
-
Priority: Major - P3
-
Affects Version/s: None
-
Fully Compatible
-
ALL
-
Query 2020-11-30, Query 2020-12-14
-
(copied to CRM)
New Description:
We have decided to fix the collstats count results. This ticket will track transitioning to a "standard" error code #26 Namespace doesn't exist, and ensuring that the result format is conforms to the format laid out in the scope document.
Original Description:
Title: $collStats behavior inconsistent across topology types when namespace does not exist
When the namespace does not exist $collStats behavior depends on the topology type. When connected to a mongos, the aggregate command returns no results:
>>> c.list_database_names() ['admin', 'config', 'foo'] >>> pprint.pprint(c.admin.command('ismaster')) {'$clusterTime': {'clusterTime': Timestamp(1528382274, 1), 'signature': {'hash': b'\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00', 'keyId': 0}}, 'ismaster': True, 'localTime': datetime.datetime(2018, 6, 7, 14, 38, 2, 567000), 'logicalSessionTimeoutMinutes': 30, 'maxBsonObjectSize': 16777216, 'maxMessageSizeBytes': 48000000, 'maxWireVersion': 7, 'maxWriteBatchSize': 100000, 'minWireVersion': 0, 'msg': 'isdbgrid', 'ok': 1.0, 'operationTime': Timestamp(1528382274, 1)} >>> pprint.pprint(c.bar.command('aggregate', 'bar', pipeline=[{"$collStats": {"count": {}}}], cursor={}, check=False)) {'$clusterTime': {'clusterTime': Timestamp(1528382172, 1), 'signature': {'hash': b'\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00', 'keyId': 0}}, 'cursor': {'firstBatch': [], 'id': 0, 'ns': 'bar.bar'}, 'ok': 1.0, 'operationTime': Timestamp(1528382172, 1), 'result': []}
When connected to a standalone server or replica set an undocumented, nonstandard error is returned (the error code is the same in both cases):
>>> c.list_database_names() ['admin', 'config', 'local'] >>> pprint.pprint(c.admin.command('ismaster')) {'ismaster': True, 'localTime': datetime.datetime(2018, 6, 7, 14, 44, 2, 765000), 'logicalSessionTimeoutMinutes': 30, 'maxBsonObjectSize': 16777216, 'maxMessageSizeBytes': 48000000, 'maxWireVersion': 7, 'maxWriteBatchSize': 100000, 'minWireVersion': 0, 'ok': 1.0, 'readOnly': False} >>> pprint.pprint(c.bar.command('aggregate', 'bar', pipeline=[{"$collStats": {"count": {}}}], cursor={}, check=False)) {'code': 40481, 'codeName': 'Location40481', 'errmsg': 'Unable to retrieve count in $collStats stage: Database [bar] not ' 'found.', 'ok': 0.0}
The behavior should be consistent regardless of topology. I think there are two choices for how to resolve this:
- Change the behavior for standalone and replica set to match mongos. That is, just don't return any results. This would match the behavior of using $group + $sum (or $count) to count the documents in a collection.
- Change the error code to a standard, documented error, and have mongos error as well. A good choice would be 26, NamespaceNotFound
My personal preference is for the first option, which matches the behavior of $count:
>>> pprint.pprint(c.bar.command('aggregate', 'bar', pipeline=[{"$match": {}}, {"$count": "count"}], cursor={}, check=False)) {'cursor': {'firstBatch': [], 'id': 0, 'ns': 'bar.bar'}, 'ok': 1.0} >>> pprint.pprint(c.bar.command('aggregate', 'bar', pipeline=[{"$match": {}}, {"$group": {"_id": None, "count": {"$sum": 1}}}], cursor={}, check=False)) {'cursor': {'firstBatch': [], 'id': 0, 'ns': 'bar.bar'}, 'ok': 1.0}
- is duplicated by
-
SERVER-33039 mongod/mongos have inconsistent behavior for $collStats with missing db
- Closed
- is related to
-
SERVER-35522 Make $collStats with count never return result field
- Closed
- related to
-
SERVER-53083 collStats results depend on topology and option.
- Closed
-
SERVER-53268 Complete TODO listed in SERVER-35479
- Closed