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

bro*_*ock 3 mongodb

我们正在重构mongo数据库,我想为一个字段提取值,并将其放入另一个字段中的数组哈希中.以下是数据在文档中的显示方式:

basecampURL: "https://basecamp.com/123/",
trackingSystems: [
    {
        type: "github",
        url: "https://github.com/org/repo/issues/"
    }
]
Run Code Online (Sandbox Code Playgroud)

以下是我希望完成的事情:

trackingSystems: [
    {
        type: "basecamp",
        url: "https://basecamp.com/123/"
    },
    {
        type: "github",
        url: "https://github.com/org/repo/issues/"
    }
]
Run Code Online (Sandbox Code Playgroud)

我已经尝试了这段代码的一些变体,而我遇到的问题是在引用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}
)
Run Code Online (Sandbox Code Playgroud)

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

Ori*_*Dar 6

您可以使用类似于此的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);
   }
)
Run Code Online (Sandbox Code Playgroud)


Joh*_*ner 5

如果可以避免,请勿使用光标。他们非常慢

现在有 mongo $rename:

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

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

  • 他正在将值移动到数组中......我认为重命名不能解决这个问题。另外,Mongo 似乎没有办法从 update() 中访问文档,因此似乎迭代所有实体并从 javascript 逻辑进行修改是可行的方法。 (4认同)