mongodb / mongo-php-library

The Official MongoDB PHP library

Home Page:https://mongodb.com/docs/php-library/current/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

$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...

  1. 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?

  2. 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!