$where is not allowed in this context
LauraTaylorUK opened this issue · comments
Hello!
I want to run a find with filters that will only give me the number of documents. Based on the documentation, the old method of db.collection.find({"type": "dog"}).count()
has been deprecated and we need to use the $collection->countDocuments($query)
.
Unfortunately, countDocuments returns the following exception error:
$where is not allowed in this context
So...
-
I can't find anything in the documentation regarding countDocuments having such limitations. Could you please point me to the right direction that mentions these limitations?
-
If I can't use countDocuments with a
$where
filter, what is the alternative? Should I just run find() and then loop the cursor and count the documents manually?
Thank you!
The countDocuments
method internally uses an aggregation pipeline, which is why $where
is not permitted. If you'd like to continue using $where
without changing your application, you can continue to use the deprecated count
method. I'm not aware of any immediate plans for the server to remove that command, despite the API being deprecated in drivers. If you're curious about the reasoning behind this deprecation, see Count API Details in the MongoDB driver CRUD specification.
I can't find anything in the documentation regarding countDocuments having such limitations.
This is discussed in the Behavior section of the documentation for MongoDB\Collection::countDocuments()
. To quote:
Since this method uses an aggregation pipeline, some query operators accepted within a MongoDB\Collection::count() filter cannot be used. Consider the following alternatives to these restricted operators:
Restricted Alternative Syntax $where $expr
If I can't use countDocuments with a $where filter, what is the alternative?
The preferred solution would be to rewrite your $where
criteria with $expr
, so it can be executed within an aggregation context. The server manual's documentation for $where
talks a bit about using $expr
in an aggregation context as an alternative. If you need more help on that, please ask in MongoDB Developer Community Forums or Stack Overflow, as it's a more general MongoDB question beyond the scope of the PHP driver/library.
But per my earlier point, you can still continue to use the deprecated count()
method if you'd rather not rewrite your query at this time.
I'll try to rewrite my $where
into $expr
and see how far I go from there.
Thank you for the excellent explanation!