简体   繁体   English

一次调用即可创建和更新多个 MongoDB 文档

[英]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基本上你需要使用upsertbulkWrite操作

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM