在一次调用中创建和更新多个MongoDB文档 [英] create and update multiple MongoDB documents in one call
问题描述
让我们假设我有一个像这样的MongoDB集合:
Let's imagine that I have a MongoDB collection like so:
[
{someId: 1, someProp: prop1, isOpen: true},
{someId: 2, someProp: prop1, isOpen: true},
{someId: 3, someProp: prop1, isOpen: true},
{someId: 4, someProp: prop1, isOpen: true},
]
我想做一个使用一组对象调用它,但其中一些对象将是新的,有些将需要覆盖现有文档。
I want to make a call to it with an array of objects, but some of these objects will be new, and some will need to override existing documents.
所以假设我的数组看起来像这样:
So let's say my array looks like this:
[
{someId: 1, someProp: prop1, isOpen: true},
{someId: 2, someProp: prop1, isOpen: true},
{someId: 5, someProp: prop1, isOpen: true},
{someId: 6, someProp: prop1, isOpen: true},
]
如何编写执行以下操作的MongoDB查询。
How do I write a MongoDB query that does the following.
如果 someId
匹配对象在我的第二个数组中,只需将 isOpen
更改为 false
。
如果 someId
与任何对象都不匹配,则将它们插入集合中。
If someId
matches an object in my second array, just change the isOpen
to false
.
If someId
doesn't match any objects then insert them into collection.
因此,在我运行查询后,我最终得到:
So after I run my query i would end up with:
[
{someId: 1, someProp: prop1, isOpen: false},
{someId: 2, someProp: prop1, isOpen: false},
{someId: 3, someProp: prop1, isOpen: true},
{someId: 4, someProp: prop1, isOpen: true},
{someId: 5, someProp: prop1, isOpen: true},
{someId: 6, someProp: prop1, isOpen: true},
]
这是一个好主意调用 forEach()
并使用:
Is it a good idea to call a forEach()
and just use:
db.books.update(
{ item: "ZZZ135" },
{
item: "ZZZ135",
stock: 5,
tags: [ "database" ]
},
{ upsert: true }
)
...在循环?可能不是。这意味着多次调用db。有没有更有效的方法呢?
...in the loop? Probably not. That would mean multiple calls to the db. Is there a more efficient way of doing that?
推荐答案
基本上你需要 bulkWrite
操作 upsert
const array = [
{ someId: 1, someProp: prop1, isOpen: true },
{ someId: 2, someProp: prop1, isOpen: true },
{ someId: 5, someProp: prop1, isOpen: true },
{ someId: 6, someProp: prop1, isOpen: true }
]
Model.bulkWrite(
array.map((data) =>
({
updateOne: {
filter: { someId: data.someId },
update: { $set: { isOpen: false, someProp: data.someProp } },
upsert: true
}
})
)
})
会给你输出
[
{ someId: 1, someProp: prop1, isOpen: false },
{ someId: 2, someProp: prop1, isOpen: false },
{ someId: 3, someProp: prop1, isOpen: true },
{ someId: 4, someProp: prop1, isOpen: true },
{ someId: 5, someProp: prop1, isOpen: true },
{ someId: 6, someProp: prop1, isOpen: true }
]
这篇关于在一次调用中创建和更新多个MongoDB文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!