[SERVER-14030] Indexes causes incorrect queries on 2.6.1 Created: 22/May/14  Updated: 10/Dec/14  Resolved: 22/May/14

Status: Closed
Project: Core Server
Component/s: Querying
Affects Version/s: 2.6.1
Fix Version/s: None

Type: Bug Priority: Major - P3
Reporter: Kevin Dew Assignee: David Storch
Resolution: Duplicate Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Duplicate
duplicates SERVER-13960 Queries containing $or may miss resul... Closed
Operating System: ALL
Steps To Reproduce:

// This is a simplified harness to replicate what we're seeing in our DB
 
// Set up data
 
/** number_user_id indexes **/
db.getCollection("number_user_id").ensureIndex({
  "_id": NumberInt(1)
},[]);
 
/** number_user_id indexes **/
db.getCollection("number_user_id").ensureIndex({
  "user_id": NumberLong(1)
},[]);
 
/** number_user_id indexes **/
db.getCollection("number_user_id").ensureIndex({
  "number": NumberLong(1)
},[]);
 
/** number_user_id indexes **/
db.getCollection("number_user_id").ensureIndex({
  "user_id": NumberLong(1),
  "number": NumberLong(1)
},{
  "unique": true
});
 
/** number_user_id records **/
db.getCollection("number_user_id").insert({
  "_id": ObjectId("537dc86a80f1cf0e42d63af1"),
  "number": null,
  "user_id": 1
});
db.getCollection("number_user_id").insert({
  "_id": ObjectId("537dc87f80f1cf0f42d63af1"),
  "number": 2,
  "user_id": 1
});
db.getCollection("number_user_id").insert({
  "_id": ObjectId("537dc87580f1cf0d42d63af1"),
  "number": 1,
  "user_id": 1
});
 
// Queries
 
db.number_user_id.find({ $or: [{ number: null }, { number: { $lte: 2 } }] });
// On 2.4 you get all 3 documents back on 2.6 you get 1 document back
 
db.number_user_id.find({ $or: [{ number: null }, { number: { $lte: 2 } }] }).count();
// On 2.4 you get 3 on 2.6 you get 1

Participants:

 Description   

Upgrading from 2.4.10 to 2.6.1 (running on OS X 10.9.2) found running an $or query with a nested $lte on indexed fields causes incorrect query results.

db.number_user_id.find({ $or: [{ number: null }, { number: { $lte: 2 } }] });
// On 2.4 you get all 3 documents back on 2.6 you get 1 document back

I posted this on Stack Overflow (http://stackoverflow.com/questions/23805916/mongodb-indexed-queries-returning-incorrect-values-since-upgrading-to-2-6-from-2) and got a couple of answers back suggesting it was a bug, with one saying it works with a sparse index.



 Comments   
Comment by David Storch [ 22/May/14 ]

Hi Kevin,

This is indeed a bug in MongoDB v2.6.1, related to how the new query engine matches documents for $or queries. It is a duplicate of SERVER-13960, which is currently in code review and scheduled to be fixed in 2.6.2.

Best,
Dave

Generated at Thu Feb 08 03:33:37 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.