使用更新更改集合中值的类型

时间:2018-08-21 11:40:15

标签: mongodb mongodb-query

我正在寻找一种方法,如何在MongoDB中更新多个文档。我想修改类似的结构:

{[
   "_id": 'mongo_id',
   "name": "Name"
]}

对于这样的结构,基本上只是将string属性更改为具有string属性的object属性:

{
   "_id": 'mongo_id',
   "name": {
       "type_1": "Name",
       "type_2": "" 
    }
} 

有没有办法在单个mongo查询中做到这一点,或者我必须在node.js中创建某种工作程序?

2 个答案:

答案 0 :(得分:0)

如果您没有涉及对集合施加约束的任何模式,或者如果您将名称定义为mixed类型(以猫鼬类型为例),则您可以对任何_id以外的属性。

例如,此更新会将name更改为所需的对象:

db.getCollection('<collectionName>').update({
  _id: "mongo_id")
}, {
name: {
  "type_1": "Name",
  "type_2": ""
}
})

答案 1 :(得分:0)

看起来最好的解决方案是创建很少的工作程序来获取所有文档并更新它们在集合中。我使用了node.js和mongodb npm包来创建类似于此程​​序的工作器:

var mongo = requiere('mongodb');

mongo.connect(process.env.MONGO_URL, function(err, database) {
    if (err) {
        throw err;
    }
    db = database;

    db.collection('<collectionName>').find({}).toArray(function(err, array) {
        if (err) {
            console.log(err);
            return process.exit(1);
        }
        console.log('length:', array.length);
        var promises = [];
        array.forEach(item => {
            promises.push(db.collection('<collectionName>').update(
               {
                  _id: item._id
               }, 
               {
                 '$set': { 
                    'name': {
                       'type_1': item.name,
                       'type_2': '',
                     } 
                  }
            }))
        });

        return Promise.all(promises).then(function() {
            console.log('Done');
            return process.exit(0);
        }).catch(function(err) {
            console.log('err:', err);
            return process.exit(1);
        });
    });
});