在一次调用中创建和更新多个MongoDB文档 [英] create and update multiple MongoDB documents in one call

查看:133
本文介绍了在一次调用中创建和更新多个MongoDB文档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

让我们假设我有一个像这样的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆