使用现有值的MongoDB Update Document

时间:2017-05-24 08:48:37

标签: mongodb

如何使用自己的值更新现有文档?

存在一个包含照片的相册集合,需要修改照片网路径以预先添加现有值。

以下内容基于答案https://stackoverflow.com/a/3792958/1283381

以下代码无法更新webPath值。

db.getCollection('Album').find().snapshot().forEach(
      function (e) {
        for(var i=0; i<e.photos.length; i++) {
            e.photos[i].webPath = '/uploads'+e.photos[i].webPath;
        }
            db.events.save(e);
    }
)

输出是:

Updated 1 existing record(s) in 2ms

修改1

示例相册文档:

{
    "_id" : ObjectId("5923e3eebe37843815248521"),
    "created" : ISODate("2017-05-23T07:25:34.000Z"),
    "photos" : [ 
    {
        "id" : 474,
        "webPath" : "/dir/to.jpg"
    }, 
    {
        "id" : 475,
        "webPath" : "/dir/to.jpg"
    }
    ]
}

1 个答案:

答案 0 :(得分:0)

你正在保存到错误的收藏品。

在循环拍摄照片并更新数据后,您可以使用以下一行:

db.events.save(e);

我希望您打算保存回您查询的原始收藏集。但是这将保存到events集合(如果它不存在则创建它),因为以下两行是等效的(see MongoDB docs)。你可能会发现你的事件集合中已经包含了你修改过的数据。

db.foo.save(x);
db.getCollection('foo').save();

相反,您需要确保将其保存回原始要查询的集合(Album集合)。在您的情况下,这可以简单地改为:

db.getCollection('Album').save(e);

您的完整代码段如下所示:

db.getCollection('Album').find().snapshot().forEach(
      function (e) {
        for(var i=0; i<e.photos.length; i++) {
            e.photos[i].webPath = '/uploads'+e.photos[i].webPath;
        }
        db.getCollection('Album').save(e);
    }
)