node.js – 尝试使用Mongoose进行批量upsert.最干净的方法是什么?

前端之家收集整理的这篇文章主要介绍了node.js – 尝试使用Mongoose进行批量upsert.最干净的方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个包含三个字段的文档的集合:first_name,last_name和age.我试图找出Mongoose中我可以使用什么查询进行批量upsert.我的应用程序偶尔会收到具有相同三个字段的新对象数组.我希望查询检查文档中是否已存在第一个和最后一个名称,如果它们存在,则更新年龄(如果它不同).否则,如果名字和姓氏不存在,请插入新文档.

目前,我只是在进行导入 – 还没有为这个upsert片段构建逻辑.

app.post('/users/import',function(req,res) {
  let data = req.body;
  let dataArray = [];
  data.forEach(datum => {
    dataArray.push({
        first: datum.first,last: datum.last,age: datum.age
    })
})

User.insertMany(dataArray,answer => {
    console.log(`Data Inserted:`,answer)
})

`

我的用户模型如下所示:

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

const userSchema = new Schema({
  first: String,last: String,age: Number,created_at: { type: Date,default: Date.now }
});

var User = mongoose.model('User',userSchema);
module.exports = User;

解决方法

(mongoose@4.9.1,mongodb@3.4.2)

在与Mongoose API poor documentation斗争之后,我解决了bulkWrite()方法中的批量upsert调整updateOne:{}操作.

一些未记载的事项需要考虑:

// suppose:
var GasStation = mongoose.model('gasstation',gasStationsSchema);
var bulkOps = [ ];

// for ( ... each gasStation to upsert ...) {
  let gasStation = { country:'a',localId:'b',xyz:'c' };
  // [populate gasStation as needed]
  // Each document should look like this: (note the 'upsert': true)
  let upsertDoc = {
    'updateOne': {
      'filter': { 'country': gasStation.country,'localId': gasStation.localId },'update': gasStation,'upsert': true
    }};
  bulkOps.push(upsertDoc);
// end for loop

// now bulkWrite (note the use of 'Model.collection')
GasStation.collection.bulkWrite(bulkOps)
  .then( bulkWriteOpResult => {
    console.log('BULK update OK');
    console.log(JSON.stringify(bulkWriteOpResult,null,2));
  })
  .catch( err => {
    console.log('BULK update error');
    console.log(JSON.stringify(err,2));
  });

这里的两个关键问题是不完整的API文档问题(在撰写本文时,至少):

>’upsert’:每个文档都为true. Mongoose API()中没有记录这一点,它通常是指node-mongodb-native驱动程序.看看updateOne in this driver,你可以考虑添加’选项’:{‘upsert’:true},但是,没有……那是不行的.我还试图将这两种情况添加到bulkWrite(,[options],)参数中,但也没有效果.
> GasStation.collection.bulkWrite().虽然Mongoose bulkWrite() method声称它应该被称为Model.bulkWrite()(在这种情况下,GasStation.bulkWrite()),它将触发MongoError:Unknown修饰符:$__.因此,必须使用Model.collection.bulkWrite().

另外,请注意:

>您不需要在updateOne.update字段中使用$set mongo运算符,因为mongoose在upsert的情况下处理它(参见bulkWrite() comments in example).
>请注意,我在模式中的唯一索引(upsert正常工作所需)定义为:

gasStationsSchema.index({country:1,localId:1},{unique:true});

希望能帮助到你.

==>编辑:(猫鼬5?)

正如@JustinSmith所注意到的那样,由Mongoose添加的$set运算符似乎不再起作用了.也许是因为Mongoose 5?

在任何情况下,明确使用$set应该:

'update': { '$set': gasStation },
原文链接:https://www.f2er.com/nodejs/241284.html

猜你在找的Node.js相关文章