[英]create and update multiple MongoDB documents in one call
Let's imagine that I have a MongoDB collection like so:假设我有一个像这样的 MongoDB 集合:
[
{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},
]
How do I write a MongoDB query that does the following.如何编写执行以下操作的 MongoDB 查询。
If someId
matches an object in my second array, just change the isOpen
to false
.如果
someId
匹配我的第二个数组中的对象,只需将isOpen
更改为false
。 If someId
doesn't match any objects then insert them into collection.如果
someId
不匹配任何对象,则将它们插入到集合中。
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},
]
Is it a good idea to call a forEach()
and just use:调用
forEach()
并使用:
db.books.update(
{ item: "ZZZ135" },
{
item: "ZZZ135",
stock: 5,
tags: [ "database" ]
},
{ upsert: true }
)
...in the loop? ...在循环? Probably not.
可能不是。 That would mean multiple calls to the db.
这意味着多次调用数据库。 Is there a more efficient way of doing that?
有没有更有效的方法来做到这一点?
Basically you needbulkWrite
operation with upsert
基本上你需要使用
upsert
bulkWrite
操作
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
}
})
)
})
Will give you the output会给你输出
[
{ 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 }
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.