4

我们正在重构一个 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 引用找到的变量时,MongoDB Update上的所有示例都使用字符串。

db.projects.update( 
    { basecampURL: '.+' }, 
    { $push: 
        { trackingSystems: 
            { 
                type: 'basecamp',
                url: basecampURL // this isn't valid, also tried $.basecampURL
            }
        },
      $unset: 
        { basecampURL: '.+' }
    },
    { multi: true}
)

似乎我没有找到如何引用找到的项目的属性,但我一直想知道是否需要在更新之前存储找到的变量。

4

2 回答 2

9

您可以使用与此类似的 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);
   }
)
于 2013-08-21T16:51:02.177 回答
4

如果可以避免,请不要使用游标。他们非常慢

现在有 mongo $rename:

db.COLLECTION_NAME.updateMany( {/*filter if you want*/}, { $rename: { "oldFieldName": "newFieldName" } } )

https://docs.mongodb.com/manual/reference/operator/update/rename/

于 2017-03-29T18:58:56.337 回答