MongoDB 2.6 中的兼容性更改

在本页面

以下 2.6 更改可能会影响与旧版本 MongoDB 的兼容性。有关 2.6 更改的完整列表,请参见MongoDB 2.6 发行说明

Index Changes

强制执行索引密钥长度限制

如果现有文档中的索引键超出限制,则创建索引将出错:

插入错误:

更新将错误:

块迁移将失败:

副本集的次要成员将警告:

如果您已有数据集,并且想要禁用默认的索引键长度验证,以便可以在解决这些索引问题之前进行升级,请使用failIndexKeyTooLong参数。

索引规范验证字段名称

MongoDB 的早期版本允许索引。

确保索引和现有索引

db.mycollection.ensureIndex( { x: 1 } )
db.mycollection.ensureIndex( { x: 1 }, { unique: 1 } )
db.mycollection.ensureIndex( { a: 1 }, { name: "myIdx" } )
db.mycollection.ensureIndex( { z: 1 }, { name: "myIdx" } )

以前的版本没有创建索引,但是没有错误。

写入方法确认

[1] 在以前的版本中,当交互式使用mongo shell 时,mongo shell 在 write 方法之后会自动调用getLastError命令以提供对写入的确认。但是,除非脚本在 write 方法之后包含对getLastError命令的“显式”调用,否则脚本在以前的版本中将观察到“即发即弃”的行为。

在分片环境中,插入或修改文档组时,使用任何驱动程序或mongo shell 的应用程序应使用Bulk()方法以获得最佳性能。

例如,代替:

for (var i = 1; i <= 1000000; i++) {
    db.test.insert( { x : i } );
}

在 MongoDB 2.6 中,替换为Bulk()操作:

var bulk = db.test.initializeUnorderedBulkOp();

for (var i = 1; i <= 1000000; i++) {
    bulk.insert( { x : i} );
}

bulk.execute( { w: 1 } );

批量方法返回包含操作结果的BulkWriteResult对象。

db.collection.aggregate() Change

var myCursor = db.orders.aggregate( [
    {
      $group: {
         _id: "$cust_id",
         total: { $sum: "$price" }
      }
    }
] );

myCursor.forEach( function(x) { printjson (x); } );

早期版本返回的单个文档的字段results包含结果集数组,但受BSON 文件大小限制。访问 MongoDB 早期版本中的结果集需要访问results字段并迭代数组。例如:

var returnedDoc = db.orders.aggregate( [
    {
      $group: {
         _id: "$cust_id",
         total: { $sum: "$price" }
      }
    }
] );

var myArray = returnedDoc.result; // access the result field

myArray.forEach( function(x) { printjson (x); } );

写关注验证

Security Changes

新的授权模型

Important

在升级授权模型之前,您应该首先将 MongoDB 二进制文件升级到 2.6. 对于分片群集,请确保所有群集组件均为 2.6. 如果在任何数据库中都有用户,则在升级 MongoDB 二进制文件之前,请确保至少有一个userAdminAnyDatabase角色的用户在admin数据库中。

SSL 证书主机名验证

使用allowInvalidCertificates设置时,MongoDB 将使用无效证书记录为警告。

Warning

allowInvalidCertificates设置会绕过其他证书验证,例如检查过期和有效签名。

2dsphere 索引版本 2

先前版本不会插入2dsphere索引字段是null或空数组的文档。对于缺少2dsphere索引字段的文档,以前的版本将插入文档并为其构建索引。

See also

Versions

Log Messages

时间戳格式更改

软件包配置更改

RPM/DEB 软件包的默认 bindIp

其他任何官方 MongoDB 软件包中均没有默认的bindIp设置。

SNMP Changes

删除方法签名更改

更新运算符语法验证

{ $set: { } }
{ $set: { a: 5 }, $set: { b: 5 } }

更新强制字段名称限制

有关写入操作协议的更改,请参见新的写操作协议;有关插入和更新操作的更改,请参见插入和更新改进。还请考虑字段名称限制的文档。

查询和排序更改

强制执行字段名称限制

稀疏索引和不完整结果

例如,除非明确提示,否则查询{ x: { $exists: false } }将不再在x字段上使用稀疏索引。

有关详细说明新行为的示例,请参见集合上的稀疏索引无法返回完整结果

sort()规范值

任何其他值都将导致错误。

以前的版本也接受truefalse进行升序。

skip()和_id 查询

_id字段上执行相等匹配时,以前的版本会忽略skip()

describe()保留查询计划缓存

在以前的版本中,explain()具有清除该查询形状的查询计划缓存的副作用。

See also

PlanCache()参考。

Geospatial Changes

$maxDistance Changes

在以前的版本中,$maxDistance可以在$near文档之内或之外。

Deprecated $uniqueDocs

加强地理空间查询的验证

查询运算符更改

$ not 查询行为更改

例如,如果集合orders包含以下文档:

{ _id: 1, status: "A", cust_id: "123", price: 40 }
{ _id: 2, status: "A", cust_id: "xyz", price: "N/A" }
{ _id: 3, status: "D", cust_id: "xyz" }

如果集合在price字段上具有索引:

db.orders.ensureIndex( { price: 1 } )

以下查询使用索引来搜索price不大于或等于50的文档:

db.orders.find( { price: { $not: { $gte: 50 } } } )

在 2.6 中,查询返回以下文档:

{ "_id" : 3, "status" : "D", "cust_id" : "xyz" }
{ "_id" : 1, "status" : "A", "cust_id" : "123", "price" : 40 }
{ "_id" : 2, "status" : "A", "cust_id" : "xyz", "price" : "N/A" }

在以前的版本中,索引计划仅在字段类型与查询谓词类型匹配的情况下返回匹配的文档:

{ "_id" : 1, "status" : "A", "cust_id" : "123", "price" : 40 }

如果使用集合扫描,则以前的版本将返回与 2.6 中相同的结果。

空比较查询

$ all 操作员行为更改

$ mod 运算符强制使用严格的语法

在以前的版本中,如果传递的数组包含一个元素,则$mod运算符将0用作第二个元素,如果传递的数组包含两个以上的元素,则$mod会忽略除前两个元素之外的所有元素。以前的版本在传递空数组时会返回错误。

$必须位于顶层

$存在且值得注意

如果 MongoDB 服务器已禁用集合扫描,即notablescan,则$exists没有“索引解决方案”的查询将出错。

MinKey 和 MaxKey 查询

具有$ elemMatch 的嵌套数组查询

例如,如果集合test包含以下文档:

{ "_id": 1, "a" : [ [ 1, 2, 5 ] ] }

在 2.6 中,以下$elemMatch查询与文档不匹配*:

db.test.find( { a: { $elemMatch: { $gt: 1, $lt: 5 } } } )

文本搜索兼容性

MongoDB 不支持在同时包含 2.4 版和 2.6 版分片的混合分片群集部署中使用$text查询运算符。有关升级说明,请参见将 MongoDB 升级到 2.6

副本集/共享群集验证

分片名称检查刷新元数据

对于同时包含 2.4 版和 2.6 版分片的混合分片群集部署,如果分片名称对于 2.6 版分片是未知的,则从 2.4 版分片**迁移到 2.6 版分片时,此更改可能导致错误。 。 MongoDB 不支持在混合分片群集部署中进行迁移。

副本集投票配置验证

时间格式更改

现在,在许多输出中格式化时间数据时,MongoDB 现在使用iso8601-local。此格式遵循模板YYYY-MM-DDTHH:mm:ss.mmm<+/-Offset>。例如2014-03-04T20:13:38.944-0500

此更改会影响在“严格模式”下使用Extended JSON的所有 Client 端,例如mongoexport

Other Resources

首页