我有一个保存文档的集合,其中包含三个字段: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;
8条答案
按热度按时间68bkxrlz1#
在与Mongoose API糟糕的文档斗争之后,我解决了
bulkWrite()
方法中的批量upsert调整updateOne:{}
操作。一些未记录的事情需要考虑:
这里的两个关键问题是API文档不完整的问题(至少在撰写本文时是这样):
'upsert': true
在每个文档中。Mongoose API()中没有说明这一点,它通常引用 * node-mongodb-native * 驱动程序。查看此驱动程序中的updateOne,您可能会想到添加'options':{'upsert': true}
,但是,不......这行不通。我还尝试将这两种情况添加到bulkWrite(,[options],)
参数中,也没有效果。Model.bulkWrite()
(在本例中为GasStation.bulkWrite()
),但这将触发MongoError: Unknown modifier: $__
,因此必须使用Model.collection.bulkWrite()
。此外,请注意:
updateOne.update
字段中使用$set
mongo操作符,因为mongoose会在upsert的情况下处理它(参见示例中的bulkWrite()注解)。gasStationsSchema.index({ country: 1, localId: 1 }, { unique: true });
希望有帮助。
@JustinSmith注意到,Mongoose添加的
$set
操作符似乎已经不起作用了,可能是因为Mongoose 5的缘故吧?在任何情况下,显式使用
$set
都应该:ep6jt1vc2#
感谢@maganap.我使用his/her answer,并达到以下简洁的方法:
或者更冗长:
flvtvl503#
我为Mongoose发布了一个小插件,它公开了一个静态的
upsertMany
方法来执行带有promise接口的批量upsert操作,这将为Mongoose批量upsert提供一种非常干净的方式,同时保留模式验证等功能:你可以在npm或Github上找到这个插件:
https://github.com/meanie/mongoose-upsert-manyhttps://www.npmjs.com/package/@meanie/mongoose-upsert-many
nfeuvbwi4#
我尝试了上面的@magnap解决方案,发现它覆盖了我只想更新的现有文档,而不是更新我在
updates.updateOne
中设置的字段,它选择了文档并将其所有字段替换为在.update
中指定的字段。我最终不得不在update方法中使用
$set
来解决这个问题。下面是我的控制器的最终外观:这适用于Mongoose 5.1.2。
of1yzvn45#
您可以使用
array.map
来代替for
i5desfxk6#
希望我在这里的回答能帮到你。它处理批量upsert为电子商务域异步
7qhs6swi7#
在上找到官方解决方案:https://docs.mongodb.com/manual/reference/method/Bulk.find.upsert/
Mongoose也支持相同的链。
测试其工作原理:
9q78igpj8#
link2
我想你是在找
查找()更新()
你可以用这个