12

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

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

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

  • 口袋.-1.items
  • 口袋.$last.items

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

4

2 回答 2

3

I don't know of a way to do this using a single-line query. But you could select the record, update and then save it.

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);
}
于 2012-05-22T18:55:04.450 回答
3

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

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

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

于 2012-05-22T19:43:51.693 回答