修改数组的最后一个元素

我有这样的对象结构:

 {
    name: "...",
    pockets: [
        {
            cdate: "....",
            items: [...]
        }
        ...
    ]
 }

在更新操作中,我想将一些记录添加到最后一个口袋项目的项目字段中。 使用点符号是我知道访问子文档的唯一方式,但我无法得到我想要的。 所以,我正在寻找这样的东西:

  • pockets.-1.items
  • pockets.$last.items
  • 是否可以修改最后一个元素? 如果是,如何?


    我不知道使用单行查询来做到这一点的方法。 但是你可以选择记录,更新并保存。

    var query = <insert query here>;
    var mydocs = db.mycollection.find(query);
    for (var i=0 ; i<mydocs.length ; i++) {
        mydocs[i].pockets[pockets.length-1].items.push('new item');
        db.mycollection.save(mydoc);
    }
    

    我不相信有可能以原子的方式做到这一点。 有一个要求将这个功能添加到MongoDB中。

    如果你可以在你的应用程序代码中确保线程安全,那么你可以使用从pockets数组中得到的一系列$ pop(将最后一个元素从pockets中移除)到变量p,然后使用$ addToSet到p.items,现在你可以使用$ push回到口袋里。 但是,如果您的应用程序无法确保只有一个进程可能同时执行此操作,则另一个进程可能会在这些步骤中修改该阵列,最终可能会丢失该更新。

    您也可以在这里查看“更新如果当前”的语义,以查看您可以通过多线程问题解决可能的竞争的另一种方式。

    链接地址: http://www.djcxy.com/p/59569.html

    上一篇: Modifying the last element of an array

    下一篇: Template functor with any parameters