修改MongoDB中数组的最后一个元素

时间:2012-05-22 18:44:31

标签: arrays mongodb

我有一个像这样的对象结构:

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

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

  • pockets.-1.items
  • 穴。$ last.items

是否可以修改最后一个元素?如果是,怎么样?

2 个答案:

答案 0 :(得分:3)

我不知道使用单行查询的方法。但您可以选择记录,更新然后保存。

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);
}

答案 1 :(得分:3)

我认为不可能原子地做到这一点。将此功能request添加到MongoDB。

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

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