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

时间:2018-08-16 17:50:16

标签: javascript mongodb mongoose

让我们想象一下,我有一个这样的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},
]

我想用一个对象数组对其进行调用,但是其中一些对象是新对象,而某些对象将需要覆盖现有文档。

所以说我的数组看起来像这样:

[
{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查询。

如果someId与第二个数组中的对象匹配,只需将isOpen更改为false。 如果someId与任何对象都不匹配,则将它们插入集合中。

因此,在我运行查询后,我最终会得到:

[
{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()并使用:

是个好主意吗?
db.books.update(
   { item: "ZZZ135" },
   {
     item: "ZZZ135",
     stock: 5,
     tags: [ "database" ]
   },
   { upsert: true }
)

...在循环中?可能不会。那将意味着多次调用数据库。有更有效的方法吗?

1 个答案:

答案 0 :(得分:1)

基本上,您需要对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
      }
    })
  )
})

将为您提供输出

[
  {  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  }
]