Mongoose 更新或插入许多文档
Posted
技术标签:
【中文标题】Mongoose 更新或插入许多文档【英文标题】:Mongoose update or insert many documents 【发布时间】:2019-07-09 21:09:23 【问题描述】:我正在尝试使用最新版本的 mongoose 来插入对象数组,或者如果相应的产品 ID 已存在则更新。我一生都无法找出正确的使用方法(bulkWrite、updateMany 等),而且我似乎无法在不出错的情况下找出语法。比如我在尝试
Product.update(, products, upsert : true, multi : true , (err, docs) => console.log(docs))
这会引发错误DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany, or bulkWrite instead. MongoError: '$set' is empty. You must specify a field like so: $set: <field>: ...
并且使用 updateMany 只会给我 $set 错误。我似乎找不到任何使用此方法的人的示例,只是想知道是否有人可以为我提供如何正确使用此方法的示例。
明确地说,我生成了一个对象数组,然后我想将它们插入到我的数据库中,或者如果条目已经存在,则更新它。我要匹配的字段称为pid
。任何提示或建议将不胜感激!
编辑:
我的产品架构
const productSchema = new mongoose.Schema(
title : String,
image : String,
price_was : Number,
price_current :
dollars : String,
cents : String
,
price_save_percent : String,
price_save_dollars : String,
price_save_endtime : String,
retailer : String
)
const Product = mongoose.model('Product', productSchema)
products
数组传递的示例
[
title: 'SOME PRODUCT',
image: '',
price_was: '139.99',
price_current: dollars: '123', cents: '.49' ,
price_save_percent: '12%',
price_save_dollars: '16.50',
price_save_endtime: null,
pid: 'VB78237321',
url: ''
,
... ,
...
]
【问题讨论】:
products
包含什么?并同时显示您的架构
我已经用产品架构和我传入的products
对象的示例更新了我的问题
插入或更新产品文档的更新标准应该是什么?
pid
字段是产品的唯一唯一 ID,并且它来自零售商,所以我假设它是非常静态的。
【参考方案1】:
你基本上需要bulkWrite
操作
要更新的数组
const products = [
title: 'SOME PRODUCT',
image: '',
price_was: '139.99',
price_current: dollars: '123', cents: '.49' ,
price_save_percent: '12%',
price_save_dollars: '16.50',
price_save_endtime: null,
pid: 'VB78237321',
url: ''
]
批量更新查询
Model.bulkWrite(
products.map((product) =>
(
updateOne:
filter: retailer : product.pid ,
update: $set: product ,
upsert: true
)
)
)
【讨论】:
好的,这正是我想要的!非常感谢提供信息的人。所以我确实有一个问题是......这实际上是在我的数组上循环。其中一些更新可能是 1000 种产品。这是这样做的方法吗?有没有办法简单地将对象数组传递给猫鼬?bulkWrite
operation 最多可以同时处理 100000 个操作。
不错的解决方案。我正在处理类似的情况并有以下问题:假设我使用 bulkWrite() 一次更新多个文档,但是在等待解决(或拒绝)承诺时,文档继续更新。在这种情况下我该怎么办?一旦 bulkWrite() 返回(未履行,只是返回承诺),我是否安全,或者更新会覆盖等待批量操作的文档?
@omer 如果您提出一个新问题并提供适当的解释会更好。
@Ashh 我尝试使用您的代码,但没有按预期工作。出于某种原因,它正在插入一些文档-我无法理解该过程何时结束。我和 ShanRobertson 有同样的情况,但问题是我需要知道插入何时完成(这需要很长时间)现在我只是循环遍历我的产品数组并检查每个产品是否存在。如果是这样 - 更新它,如果不是 - 插入新的。我一直在寻找改进它的方法,这是我第一次看到可以实际工作的东西。你能帮我吗? (为什么这么慢?!)以上是关于Mongoose 更新或插入许多文档的主要内容,如果未能解决你的问题,请参考以下文章
如果未找到 ID,则 Mongoose 更新文档或插入新文档(Express REST API)