MongoDB和Node.js中的InvalidKey

MongoDB和Node.js中的InvalidKey,node.js,mongodb,Node.js,Mongodb,我有一个文件,其密钥为IP“10.11.190.14:cgi6web-1”:。尝试在mongoDB中插入文件时,出现以下错误: 错误:键10.11.190.14:cgi6-web-1不能包含“.” 错误(未知源) 我没有权限更改该文件,是否有任何方法可以将该文件以IP作为密钥写入mongoDB 我的代码如下: var MongoClient = require('./lib/mongodb').MongoClient; var file = require (__dirname + '/func

我有一个文件,其密钥为IP
“10.11.190.14:cgi6web-1”
:。尝试在mongoDB中插入文件时,出现以下错误:

错误:键10.11.190.14:cgi6-web-1不能包含“.” 错误(未知源)

我没有权限更改该文件,是否有任何方法可以将该文件以IP作为密钥写入mongoDB

我的代码如下:

var MongoClient = require('./lib/mongodb').MongoClient;
var file = require (__dirname + '/functions.json');

MongoClient.connect('mongodb://phx8b03c-fb1d',
    function (err, client) {
        if (err) throw err;

        client.createCollection('lbTopology' , function (err, collection) {
            if (err) throw err;

            collection.insert(file, 'lbTopology' , function (err) {
                if (err) throw err;

                client.close(function (err) {
                    if (err) throw err;

                    console.log('done');
                });
            });
        });
    })

有人能帮我吗?

您可以将
的“池”
更改为
数组
,移动键使其成为每个内部
对象的属性

{
    "Pools": [
        {
            "_key": "10.2.90.83: cgi5-web-1-80",
            "tags": "dc=PHXodbPool=cgi5-web-1-80",
            "oname": "10.2.90.83: cgi5-web-1-80",
            "pname": "syi-web",
            "oid_suffix": [
                19
            ]
        },
        // ...
    ]
}
您可以使用和来完成此操作:

var file = require (__dirname + '/functions.json');

file.Pools = Object.keys(file.Pools).map(function (key) {
    var pool = file.Pools[key];
    pool._key = key;
    return pool;
});
[编辑]
LBs
会更有趣,因为每个对象都有一个需要相同处理的
pnames
。此外,由于
pnames
下的每个项目都是一个
数字
,因此您必须创建一个
对象
,用它的键保存它

file.LBs = Object.keys(file.LBs).map(function (key) {
    var lb = file.LBs[key];
    lb._key = key;

    lb.pnames = Object.keys(lb.pnames).map(function (pkey) {
        return { key: pkey, value: lb.pnames[pkey] };
    });

    return lb;
});

您可以将
“Pools”
更改为
数组
,移动键使其成为每个内部
对象的属性

{
    "Pools": [
        {
            "_key": "10.2.90.83: cgi5-web-1-80",
            "tags": "dc=PHXodbPool=cgi5-web-1-80",
            "oname": "10.2.90.83: cgi5-web-1-80",
            "pname": "syi-web",
            "oid_suffix": [
                19
            ]
        },
        // ...
    ]
}
您可以使用和来完成此操作:

var file = require (__dirname + '/functions.json');

file.Pools = Object.keys(file.Pools).map(function (key) {
    var pool = file.Pools[key];
    pool._key = key;
    return pool;
});
[编辑]
LBs
会更有趣,因为每个对象都有一个需要相同处理的
pnames
。此外,由于
pnames
下的每个项目都是一个
数字
,因此您必须创建一个
对象
,用它的键保存它

file.LBs = Object.keys(file.LBs).map(function (key) {
    var lb = file.LBs[key];
    lb._key = key;

    lb.pnames = Object.keys(lb.pnames).map(function (pkey) {
        return { key: pkey, value: lb.pnames[pkey] };
    });

    return lb;
});


在尝试插入之前,请将文件密钥中的“.”替换为“u”?如何操作?jsp不是很好。它们可以在文件中从键更改为值吗?与其说是
{10.11.190.14:cgi6web-1:…}
,不如说是
{“key:”10.11.190.14:cgi6web-1“,…}
?这可能会使以后的查询更简单:
collection.find({key:'10.11.190.14:cgi6web-1'},})
。我没有编辑文件的权限,但只需读取并将其写入Mongodbc。您能在这里发布json文件吗?您可以编辑敏感字段,但我们需要该结构来了解如何在插入到MongoDB之前转换json文件。在尝试插入之前,将文件键中的“.”替换为“u”?我该怎么做?jsp不是很好。它们可以在文件中从键更改为值吗?与其说是
{10.11.190.14:cgi6web-1:…}
,不如说是
{“key:”10.11.190.14:cgi6web-1“,…}
?这可能会使以后的查询更简单:
collection.find({key:'10.11.190.14:cgi6web-1'},})
。我没有编辑文件的权限,但只需读取并将其写入Mongodbc。您能在这里发布json文件吗?您可以编辑敏感字段,但我们需要结构来了解如何在插入MongoDB之前转换json文件。谢谢Jonathan。因此,与其使用collection.insert(文件'lbTopology',函数(err){if(err)throw err;我需要使用collection.insert(池,'lbTopology',函数(err){if(err)throw err;??@user2325703这应该允许您仍然
.insert(文件,…)
。在这之前,它只是更改了
池的属性,这样Mongo会更容易接受它。@JonathanLonowski在保存、索引等过程中不会产生一些开销吗?@S.D.嗯,我肯定会有一些。我对分析Mongo的知识还不够,无法真正回答。不过,我不认为这会造成比尝试更多的开销ted使用原始对象。@Jonathan.itwork.。非常感谢。我还有一个JSON文件。“LBs”:{“10.11.190.14”:{“tags”:“lbtype=netscaler shared primary host=sjclb99-map00.sjc.com”,“oname”:“10.11.190.14”,“pnames”:{“10.11.190.14:cgi6-web-1”:1,“10.11.190.14:icgi6-web-1”:1},因为pnames也有Key,value。我尝试了这个函数file.LBs.pnames=Object.keys(file.LBs.pnames).map(函数(Key){var lbPname=file.LBs.pnames[Key];lbPname.\u Key=Key;return lbPname;});但是dint工作感谢Jonathan。因此,不使用collection.insert(文件'lbTopology',函数(err){if(err)throw err;我需要使用collection.insert(池'lbTopology',函数(err){if(err)抛出err;??@user2325703这应该允许您仍然
.insert(文件,…)
。在这之前,它只是更改了
池的属性,这样Mongo会更容易接受它。@JonathanLonowski在保存、索引等过程中不会产生一些开销吗?@S.D.嗯,我肯定会有一些。我对分析Mongo的知识还不够,无法真正回答。不过,我不认为这会造成比尝试更多的开销ted使用原始对象。@Jonathan.itwork.。非常感谢。我还有一个JSON文件。“LBs”:{“10.11.190.14”:{“tags”:“lbtype=netscaler shared primary host=sjclb99-map00.sjc.com”,“oname”:“10.11.190.14”,“pnames”:{“10.11.190.14:cgi6-web-1”:1,“10.11.190.14:icgi6-web-1”:1},因为pnames也有Key,value。我尝试了这个函数file.LBs.pnames=Object.keys(file.LBs.pnames).map(函数(Key){var lbPname=file.LBs.pnames[Key];lbPname.\u Key=Key;return lbPname;});但是这个函数不起作用