在文档中移动mongo字段(如果存在)

时间:2013-08-21 16:29:12

标签: mongodb

我们正在重构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}
)

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

2 个答案:

答案 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/