节点js mongodb更新数组,索引在变量中

时间:2014-09-18 07:28:28

标签: javascript arrays node.js mongodb

我有一个mongoDB文档,当它以对象形式出现时,你会像这样访问所需的数组:

map.layers.1.data.INDEX

这就是我现在所拥有的:

//Where = index, to = change to this
selector["data.layers.1.data."+where];
mDB.update({"_id":msg.island+msg.map}, {$set:{selector:to}} , function(err, doc) {
    console.log(doc);
});

(我用Tiled制作了我的地图。) 数据是一个数组,我只想更新那个数组索引。但该指数必须来自变量。有没有办法在mongoDB中执行此操作?

我正在阅读整个文档,然后替换想要的数据,然后更新整个文档。而那不是好的,快的或必要的(我希望)。

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解您的描述 - 示例文档会有所帮助 - 但我会对此感到满意。假设您的文档看起来像

{
    "data" : {
        "layer" : [
            { "data" : [ 2, 5] },
            { "data" : [ 99 ] },
            { "data" : [ 0, 1, 2, 3 ] },
            { "data" : [ -1, "truffles", 6 ] },
        ]
    }
}

然后你可以在mongo shell中更新存储为变量data.layer.2.data的值的数组myIndex的固定索引(类似于节点但是同步,没有回调)

var myIndex = complicatedprocedureforgeneratingtheindex() // myIndex = 1
var mySet = {}
mySet["data.layer.2.data." + myIndex] = to
db.map.update(myQuery, { "$set" : mySet })
db.map.find(myQuery)
{
    "data" : {
        "layer" : [
            { "data" : [ 2, 5] },
            { "data" : [ 99 ] },
            { "data" : [ 0, 99, 2, 3 ] },
            { "data" : [ -1, "truffles", 6 ] },
        ]
    }
}

大致(即有想法,但没有未定义变量的复制粘贴b / c)

答案 1 :(得分:0)

这正是答案!

为了更新具有给定索引的数组,您必须在更新之前定义一个对象单独

set = {};

然后使用[] embraces将索引指定为对象的属性。

set['example.nested.object.' + i] = foo; 

然后只需更新您的MongoDB

Collection.update($set: set);

应该工作。