自 2.4 升级到 2.6 以来,MongoDB 索引查询返回不正确的值

标签 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

如果删除联合索引,我可以获得正确的结果,但这会损害数据完整性。

我在文档/变更日志中找不到这种情况。所以我想知道我是否需要做不同的索引、重写查询或者我是否发现了 MongoDB 错误。

最佳答案

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

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

关于自 2.4 升级到 2.6 以来,MongoDB 索引查询返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23805916/

相关文章:

Java MongoDB 驱动程序 : How to update all Documents in Collection?

mongodb - 更改数据目录后无法启动 MongoDB

arrays - Mongoose 查询 : Find an element inside an array

c# - 无法加载文件或程序集 mongocrypt

node.js - 在 Mongoose 插件中添加字段给出 "TypeError: Invalid value for schema path ` CreatedBy.type`"

mongodb - 为什么在尝试从mongo集合中获取文档时为什么会出现 “client disconnected”错误?

node.js - 使用 Mongoose 将项目推送到对象中的数组

node.js - 在 Mongoose 中填充后查询

javascript - React Js 中的数据检索和分配

node.js - Mongoose 填充 - 数组