我们正在重构mongo数据库,我想拉取一个字段的值,并将其放入另一个字段的数组中的哈希值。以下是数据在文档中的外观:
basecampURL: "https://basecamp.com/123/",
trackingSystems: [
{
type: "github",
url: "https://github.com/org/repo/issues/"
}
]
以下是我希望实现的目标:
trackingSystems: [
{
type: "basecamp",
url: "https://basecamp.com/123/"
},
{
type: "github",
url: "https://github.com/org/repo/issues/"
}
]
我尝试过这段代码的一些变体,而我遇到的问题是在引用basecampURL的found变量时,MongoDB Update上的所有示例都使用了字符串。
db.projects.update(
{ basecampURL: '.+' },
{ $push:
{ trackingSystems:
{
type: 'basecamp',
url: basecampURL // this isn't valid, also tried $.basecampURL
}
},
$unset:
{ basecampURL: '.+' }
},
{ multi: true}
)
似乎我没有找到如何引用找到的项目的属性,但我一直想知道是否需要在更新之前存储找到的变量。
答案 0 :(得分:5)
您可以使用类似于此的javascript函数实现此目的:
db.coll.find({basecampURL : {$exists : true}}).forEach(
function(doc) {
var bc = {};
bc.type = "basecamp";
bc.url = doc.basecampURL;
doc.trackingSystems.push(bc);
// deletes the previous value
delete doc.basecampURL;
db.coll.save(doc);
}
)
答案 1 :(得分:1)
如果可以避免使用光标,请不要使用光标。它们非常慢
现在有mongo $ rename:
db.COLLECTION_NAME.updateMany( {/*filter if you want*/}, { $rename: { "oldFieldName": "newFieldName" } } )
https://docs.mongodb.com/manual/reference/operator/update/rename/