在嵌入字段上尝试ensureIndex时出错(键名不能包含"。")

时间:2014-11-15 13:06:58

标签: node.js mongodb

我们一直在使用mongodb / nodejs驱动程序几年,目前正在使用最新的驱动程序/ mongodb数据库升级我们的系统。除索引外,一切都进展顺利。

尝试使用collection.ensureIndex函数添加索引时出错。这是我的第一个问题,所以我会尽量详细说明。我没有发现任何相关问题...

以下是我们当前的版本:

  • 节点:v0.10.33
  • Mongodb驱动程序:v2.0.5
  • Mongodb数据库:v2.4.12

这是一个测试样本:

var MongoClient = require('mongodb').MongoClient,
  test = require('assert');
MongoClient.connect('mongodb://localhost:28888/test', function(err, db) {
  var collection = db.collection('ensureIndexEmbedded');
  // Create an index on the a field
  collection.ensureIndex( {"a.c":1}
    , {background:true, w:1}, function(err, indexName) {
      console.log(err);
      //test.equal(null,err);
      db.close();
  });
});

运行测试的结果:

$ node testindex.js
js-bson: Failed to load c++ bson extension, using pure JS version
{ [MongoError: n/a]
  name: 'MongoError',
  message: 'n/a',
  ok: 1,
  n: 1,
  code: 14,
  errmsg: 'key a.c must not contain \'.\'',
  writeErrors: [ { index: 0, code: 14, errmsg: 'key a.c must not contain \'.\'' } ] }

是否有可能警告 js-bson: Failed to load c++ bson extension与此问题相关联?或者用于创建索引的语法有什么问题吗?

任何帮助都将受到高度赞赏!

4 个答案:

答案 0 :(得分:1)

如果有人仍然感兴趣。问题在于分配给索引的默认名称。由于它是由字段名称构造的,因此它包含一个点。您可以简单地明确命名索引。只需将“name”字段添加到ensureIndex函数调用的options参数中,它应该没问题。

答案 1 :(得分:1)

我用mongojs v2.4.0和mongod v3.2.1解决了类似的错误信息。

当我尝试在嵌套字段上创建索引时出现此错误,但索引已存在且具有不同的选项。例如。 {"unique" : true}选项集。同样,错误消息只是超级混乱,因为在以下情况下,带有点符号的相同嵌套键成功:

  • 如果我尝试使用相同的选项创建(已存在的)索引
  • 如果我尝试创建缺失的索引则成功

答案 2 :(得分:0)

我刚刚使用MongoDB 2.6.5测试了相同的代码,确实它工作正常。 2.0.5驱动程序和MongoDB 2.4.12

之间似乎存在兼容性问题

答案 3 :(得分:0)

如果仍然有人遇到此问题,即使您按照记录手动设置了该名称,就像这样

YourSchema.index({
  "a.c":1
}, { 
  name: 'a_new_manually_defined_name_for_this_index'
});

您仍然遇到此错误,key a.c must not contain \'.\'

您必须首先手动删除任何旧的现有索引。然后错误消失了,并使用您定义的名称创建了新索引。