ChatGPT解决这个技术问题 Extra ChatGPT

如何删除mongodb中的数组元素?

这是数组结构

contact: {
    phone: [
        {
            number: "+1786543589455",
            place: "New Jersey",
            createdAt: ""
        }
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }

    ]
}

在这里,我只知道 mongo id(_id) 和电话号码(+1786543589455),我需要从文档中删除整个相应的数组元素。即电话数组中的零索引元素与电话号码匹配,需要删除相应的数组元素。

contact: {
    phone: [
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }
    ]
}

我尝试了以下更新方法

collection.update(
    { _id: id, 'contact.phone': '+1786543589455' },
    { $unset: { 'contact.phone.$.number': '+1786543589455'} }
);

但它会从内部数组对象中删除 number: +1786543589455,而不是 phone 数组中的零索引元素。尝试使用 pull 也没有成功。

如何删除mongodb中的数组元素?


L
Leonid Beschastny

尝试以下查询:

collection.update(
  { _id: id },
  { $pull: { 'contact.phone': { number: '+1786543589455' } } }
);

它将找到具有给定 _id 的文档,并从其 contact.phone 数组中删除电话 +1786543589455

您可以使用 $unset 取消设置数组中的值(将其设置为 null),但不能完全删除它。


谢谢你。它工作得很好。我尝试使用 { $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }{ $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } } 没有成功。不了解位置操作员在这里的工作吗?
有回电吗?
@iLoveUnicorns,您可以添加回调作为第三个参数,或者您可以使用返回的承诺。
@LeonidBeschastny 我试过这个。就我而言,我有多个具有相同密钥的文档。我想 $pull 所有这些文档,但当前查询仅更改 1 个文档然后停止。我需要什么改变?
@ShubhamA。默认情况下 .update() 更新单个文档。要更新多个文档,请使用 { multi: true } 选项。请参阅db.collection.update docs for details
c
chirag jain

下面的代码将从数组中删除完整的对象元素,其中电话号码是“+1786543589455”

db.collection.update(
  { _id: id },
  { $pull: { 'contact': { number: '+1786543589455' } } }
);

M
Md Alamin

在 Mongoose 中:来自 document

要从子文档数组中删除文档,我们可以传递一个具有匹配 _id 的对象。

contact.phone.pull({ _id: itemId }) // remove
contact.phone.pull(itemId); // this also works

有关正确答案,请参阅 Leonid Beschastny 的答案。


S
Syeda Aimen Batool

您可以简单地使用 $pull 删除子文档。 $pull 运算符从现有数组中删除与指定条件匹配的一个或多个值的所有实例。

Collection.update({
    _id: parentDocumentId
  }, {
    $pull: {
      subDocument: {
        _id: SubDocumentId
      }
    }
  });

这将根据给定的 ID 找到您的父文档,然后从子文档中删除与给定条件匹配的元素。

阅读有关拉动 here 的更多信息。


K
KayV

要删除所有数组元素而不考虑任何给定的 id,请使用以下命令:

collection.update(
  { },
  { $pull: { 'contact.phone': { number: '+1786543589455' } } }
);

D
Donald French

鉴于配置文件集合中的以下文档:

{ _id: 1, 票数: [ 3, 5, 6, 7, 7, 8 ] }

以下操作将从投票数组中删除所有大于或等于 ($gte) 6 的项目:

db.profiles.update( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } )

更新操作后,文档只有小于 6 的值:

{ _id: 1, 票数: [ 3, 5 ] }

如果您的多个项目具有相同的值,则应使用 $pullAll 而不是 $pull。

在具有多个联系电话的问题中,使用相同的方法:

collection.update( { _id: id }, { $pullAll: { 'contact.phone': { number: '+1786543589455' } } } );它将删除与该数字匹配的所有项目。在联系电话中

尝试阅读手册。


在传真号码和语音号码相同的问题中使用
N
NonameLover

如果您使用 Mongoose API 并希望提取子/子对象:阅读此内容 document 完成编辑后不要忘记使用 save() ,否则更改将不会保存到数据库中。