Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 使用update更改集合中值的类型_Mongodb_Mongodb Query - Fatal编程技术网

Mongodb 使用update更改集合中值的类型

Mongodb 使用update更改集合中值的类型,mongodb,mongodb-query,Mongodb,Mongodb Query,我正在寻找一种方法,如何在MongoDB中更新多个文档。我想修改类似的结构,如下所示: {[ "_id": 'mongo_id', "name": "Name" ]} var mongo = requiere('mongodb'); mongo.connect(process.env.MONGO_URL, function(err, database) { if (err) { throw err; } db = database;

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

{[
   "_id": 'mongo_id',
   "name": "Name"
]}
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);
        });
    });
});
对于这样的结构,基本上只需将string属性更改为具有string属性的object属性:

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

有没有一种方法可以在单个mongo查询中实现这一点,或者我必须在node.js中创建某种worker?

如果您没有任何模式来对集合进行约束,或者如果您有,并且名称被定义为
混合类型(以mongoose类型为例)然后,您可以对除
\u id
之外的任何属性执行任何操作

例如,此更新将更改所需对象的名称:

db.getCollection('<collectionName>').update({
  _id: "mongo_id")
}, {
name: {
  "type_1": "Name",
  "type_2": ""
}
})
db.getCollection(“”).update({
_id:“mongo_id”)
}, {
姓名:{
“类型1”:“名称”,
“类型_2”:”
}
})

看起来最好的解决方案是创建一个小工人来获取所有文档并在集合中更新它们。我使用node.js和mongodb npm包创建了与此类似的worker:

{[
   "_id": 'mongo_id',
   "name": "Name"
]}
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);
        });
    });
});
var mongo=requiree('mongodb');
connect(process.env.mongo_URL,函数(err,数据库){
如果(错误){
犯错误;
}
db=数据库;
db.collection(“”).find({}).toArray(函数(err,数组){
如果(错误){
控制台日志(err);
返回流程。退出(1);
}
log('length:',array.length);
var承诺=[];
array.forEach(项=>{
promises.push(db.collection(“”).update(
{
_id:item.\u id
}, 
{
“$set”:{
“姓名”:{
“type_1”:item.name,
“类型2”:“,
} 
}
}))
});
返回Promise.all(promises).then(function(){
console.log('Done');
返回流程。退出(0);
}).catch(函数(err){
log('err:',err);
返回流程。退出(1);
});
});
});

我正在寻找一种方法,如何在集合中的所有文档中实现这一点。我已经创建了用于转换所有文档和更新数据库的小cron。我只是想知道是否有办法只在mongoDB中动态地进行收集。