我们一直在使用mongodb / nodejs驱动程序几年,目前正在使用最新的驱动程序/ mongodb数据库升级我们的系统。除索引外,一切都进展顺利。
尝试使用collection.ensureIndex
函数添加索引时出错。这是我的第一个问题,所以我会尽量详细说明。我没有发现任何相关问题...
以下是我们当前的版本:
这是一个测试样本:
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
与此问题相关联?或者用于创建索引的语法有什么问题吗?
任何帮助都将受到高度赞赏!
答案 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 \'.\'
您必须首先手动删除任何旧的现有索引。然后错误消失了,并使用您定义的名称创建了新索引。