如何使用MongoDB& amp; Node.js的?

时间:2016-04-21 15:13:18

标签: node.js mongodb

让我们说我有一系列电影类型如下:

[ 
    { id: 28, name: 'Action' },
    { id: 12, name: 'Adventure' },
    { id: 16, name: 'Animation' },
    { id: 35, name: 'Comedy' },
    { id: 80, name: 'Crime' },
    { id: 99, name: 'Documentary' },
    { id: 18, name: 'Drama' },
    { id: 10751, name: 'Family' },
    { id: 14, name: 'Fantasy' },
    { id: 10769, name: 'Foreign' },
    { id: 36, name: 'History' },
    { id: 27, name: 'Horror' },
    { id: 10402, name: 'Music' },
    { id: 9648, name: 'Mystery' },
    { id: 10749, name: 'Romance' },
    { id: 878, name: 'Science Fiction' },
    { id: 10770, name: 'TV Movie' },
    { id: 53, name: 'Thriller' },
    { id: 10752, name: 'War' },
    { id: 37, name: 'Western' }
]

我和MongoDB(v3.2)实例有连接:db,我使用标准的mongodb Node.js驱动程序(const mongodb = require('mongodb').MongoClient)。

我希望能够做的是对集合进行一次批量upsert操作,比如genres,其中_id字段映射到我们类型对象的id字段。< / p>

现在,我知道我可以遍历数组中的每个项目,并做一个简单的upsert:

for (let i = 0; i < genres.length; i++) {
  await db.collection('genres').update(
    { _id: genres[i].id },
    genres[i],
    { upsert: true }
  );
}

但这感觉浪费错误。

是否有更简单的方法来完成应该是一项相对简单的任务?

由于

2 个答案:

答案 0 :(得分:6)

使用 bulkWrite API执行更新:

var bulkUpdateOps = genres.map(function(doc) {
    return {
        "updateOne": {
            "filter": { "_id": doc.id },
            "update": { "$set": { "name": doc.name } },
            "upsert": true
        }
    };
});

db.collection('genres').bulkWrite(bulkUpdateOps, function(err, r) {
    // do something with result
}

如果你正在处理更大的数组,即&gt; 1000然后考虑将批量写入服务器的500个批次发送到服务器,因为您不是每次向服务器发送每个请求,而是每500个请求中只有一次:

var bulkUpdateOps = [],
    counter = 0;

genres.forEach(function(doc) {
    bulkUpdateOps.push({
        "updateOne": {
            "filter": { "_id": doc.id },
            "update": { "$set": { "name": doc.name } },
            "upsert": true
        }
    });
    counter++;

    if (counter % 500 == 0) {
        db.collection('genres').bulkWrite(bulkUpdateOps, function(err, r) {
            // do something with result
        });
        bulkUpdateOps = [];
    }
})

if (counter % 500 != 0) {
    db.collection('genres').bulkWrite(bulkUpdateOps, function(err, r) {
        // do something with result
    }
}

答案 1 :(得分:2)

我会尝试:

db.collection('genres').update(genres, {upsert: true, multi: true});

注意:未经测试的代码......

更新:将id字段重新映射为_id

var _genres = genres.map(function(genre) {
   return { _id: genre.id, name: genre.name };
});

db.collection('genres').update(_genres, {upsert: true, multi: true});