由于从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错误。
答案 0 :(得分:2)
这是一个已确认的错误https://jira.mongodb.org/browse/SERVER-14030
由于在MongoDB 2.6.2 https://jira.mongodb.org/browse/SERVER-13960
中得到修复