MongoDB索引查询返回错误的值,因为从2.4升级到2.6

时间:2014-05-22 11:45:25

标签: mongodb

由于从2.4升级到2.6,我发现索引导致某些查询产生错误的值。

我们的数据集是这样的:

// This is a simplified harness to replicate what we're seeing in our DB
/** 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
});

查询差异如下:

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

如果我删除了联合索引,我可以得到正确的结果,但这会使数据完整性受到影响。

我无法在docs / changelog中找到此方案。所以我想知道我是否需要做不同的索引,重写查询或者我是否发现了MongoDB错误。

1 个答案:

答案 0 :(得分:2)

这是一个已确认的错误https://jira.mongodb.org/browse/SERVER-14030

由于在MongoDB 2.6.2 https://jira.mongodb.org/browse/SERVER-13960

中得到修复