如何使用自己的值更新现有文档?
存在一个包含照片的相册集合,需要修改照片网路径以预先添加现有值。
以下内容基于答案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"
}
]
}
答案 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);
}
)