【问题标题】:Node js mongodb updating array with index in variableNode js mongodb用变量中的索引更新数组
【发布时间】:2014-09-18 07:28:27
【问题描述】:

我有一个 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 制作了我的地图。) 其中 data 是一个数组,我只想更新那个数组索引。但是该索引必须来自一个变量。有没有办法在 mongoDB 中做到这一点?

我目前正在阅读整个文档,然后替换想要的数据,然后更新整个文档。这既不好,又不好,也没有必要(我希望)。

【问题讨论】:

    标签: javascript arrays node.js mongodb


    【解决方案1】:

    不确定我是否理解您的描述 - 示例文档会有所帮助 - 但我会尽力而为。假设您的文档看起来像

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

    然后您可以更新数组data.layer.2.data 的固定索引,该索引存储为变量myIndex 的值,就像在mongo shell 中一样(类似于节点,但同步,无回调)

    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)

    【讨论】:

      【解决方案2】:

      这正是答案!

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

      set = {};
      

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

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

      然后更新你的 MongoDB

      Collection.update($set: set);
      

      应该可以。

      【讨论】:

        猜你喜欢
        • 2016-11-04
        • 2017-07-11
        • 2016-06-09
        • 2021-06-17
        • 2013-01-13
        • 1970-01-01
        • 2014-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多