首页 > 解决方案 > mongodb 从多个文档中删除特定的数组项(nodejs)

问题描述

我正在尝试从多个文档中删除特定的数组项。假设我们有以下文件:

{
  _id: ...,
  email: 'person1@email.com',
  tasks: [
     { title: 'some titleA', uuid: 'uuidA'},
     { title: 'some titleB', uuid: 'uuidB'},
     { title: 'some titleC', uuid: 'uuidC'},
  ]
},
{
  _id: ...,
  email: 'person2@email.com',
  tasks: [
     { title: 'some titleA', uuid: 'uuidA'},
     { title: 'some titleB', uuid: 'uuidB'},
     { title: 'some titleC', uuid: 'uuidC'},
  ]
},
{
  _id: ...,
  email: 'person3@email.com',
  tasks: [
     { title: 'some titleA', uuid: 'uuidA'},
     { title: 'some titleB', uuid: 'uuidB'},
     { title: 'some titleC', uuid: 'uuidC'},
  ]
}

然后,给定一个电子邮件列表,说person1@email.comperson2@email.com从与这些电子邮件匹配的任何文档的 数组中删除value 为tasks的数组项。uuiduuidB

结果应该是

{
  _id: ...,
  email: 'person1@email.com',
  tasks: [
     { title: 'some titleA', uuid: 'uuidA'},
     { title: 'some titleC', uuid: 'uuidC'},
  ]
},
{
  _id: ...,
  email: 'person2@email.com',
  tasks: [
     { title: 'some titleA', uuid: 'uuidA'},
     { title: 'some titleC', uuid: 'uuidC'},
  ]
},
{
  _id: ...,
  email: 'person3@email.com',
  tasks: [
     { title: 'some titleA', uuid: 'uuidA'},
     { title: 'some titleB', uuid: 'uuidB'},
     { title: 'some titleC', uuid: 'uuidC'},
  ]
}

这是我到目前为止所尝试的:

 var emails = ['person1@email.com', 'person2@email.com']
 model.updateMany({
    email: { $in: emails },
 }, {
    $pull: {
        tasks: {
            $elemMatch: { uuid: uuid }
        }
    }
})

谢谢您的帮助!

标签: javascriptnode.jsmongodbmongodb-query

解决方案


$elemMatchqueryandprojection运算符而不是update operator. 因此你不能在这里使用它。

您需要使用“绝对”对象结构

model.updateMany(
  { "email": { "$in": emails }},
  { "$pull": { "tasks": { "uuid": uuid }}}
)

推荐阅读