[JAVA-4006] Filters can produce invalid query shapes in Java 4.0+ Created: 09/Feb/21  Updated: 21/Apr/22  Resolved: 15/Jul/21

Status: Closed
Project: Java Driver
Component/s: Builders
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Major - P3
Reporter: Alex Bevilacqua Assignee: Jeffrey Yemin
Resolution: Won't Fix Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Related
related to JAVA-3338 $geoWithin cannot contain multiple fi... Closed
related to SERVER-1454 Use $not as a top-level logical op Backlog
related to JAVA-4008 Document JAVA-4006 in Driver Upgrade ... Closed
Case:

 Description   

The Filters produce different query shapes between versions 3.12 and 4.0 of the driver.

In some situations this can result in 4.x producing an invalid query shape such as emitting a top level $not:

package com.tour;
 
import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.*;
import com.mongodb.client.model.Filters;
 
import org.bson.BsonDocument;
import org.bson.Document;
 
 
public class Test12 {
 
    public static void main(final String[] args) {
 
      ConnectionString mongoURI = new ConnectionString("mongodb://localhost:27017/test");
      MongoClient mongoClient = MongoClients.create(mongoURI);
      MongoDatabase db = mongoClient.getDatabase("test");
      MongoCollection<Document> coll =  db.getCollection("foo");
      BsonDocument filters = Filters.and(
        Filters.and(
                Filters.lt("field1", 100),
                Filters.gt("field2", 100)),
        Filters.and(Filters.not(Filters.and(Filters.lt("value", 1))))).toBsonDocument(BsonDocument.class,
        MongoClientSettings.getDefaultCodecRegistry());
      System.out.println(filters);
 
      Document first = coll.find(filters).first();
 
      System.out.println(first);
    }
}

When testing the above in 3.12:

<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongodb-driver-sync</artifactId>
  <version>3.12.7</version>
</dependency>

output: {"field1": {"$lt": 100}, "field2": {"$gt": 100}, "value": {"$not": {"$lt": 1}}}

When testing the above in 4.0:

<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongodb-driver-sync</artifactId>
  <version>4.0.0</version>
</dependency>

output:
{"$and": [{"$and": [{"field1": {"$lt": 100}}, {"field2": {"$gt": 100}}]}, {"$and": [{"$not": {"$and": [{"value": {"$lt": 1}}]}}]}]}
Exception in thread "main" com.mongodb.MongoQueryException: Query failed with error code 2 and error message 'unknown top level operator: $not' on server localhost:27017
        at com.mongodb.internal.operation.FindOperation$1.call(FindOperation.java:661)
        at com.mongodb.internal.operation.FindOperation$1.call(FindOperation.java:651)
        at com.mongodb.internal.operation.OperationHelper.withReadConnectionSource(OperationHelper.java:583)
        at com.mongodb.internal.operation.FindOperation.execute(FindOperation.java:651)
        at com.mongodb.internal.operation.FindOperation.execute(FindOperation.java:79)
        at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:178)
        at com.mongodb.client.internal.MongoIterableImpl.execute(MongoIterableImpl.java:135)
        at com.mongodb.client.internal.MongoIterableImpl.iterator(MongoIterableImpl.java:92)
        at com.tour.Test12.main(Test12.java:34)



 Comments   
Comment by Jeffrey Yemin [ 15/Jul/21 ]

I'm going to close this on charlie.swanson's recommendation.  The fix, when it comes, will be in the server in scope of SERVER-1454.

Generated at Thu Feb 08 09:01:00 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.