182

这是数组结构

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从内部数组对象中删除,而不是电话数组中的零索引元素。试过pull也没有成功。

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

4

7 回答 7

304

尝试以下查询:

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

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

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

于 2013-06-06T10:25:10.463 回答
24

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

db.collection.update(
  { _id: id },
  { $pull: { 'contact': { number: '+1786543589455' } } }
);
于 2017-03-23T10:18:12.180 回答
4

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

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

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

在此处阅读有关拉取的更多信息。

于 2018-08-23T09:18:53.050 回答
4

在猫鼬中:来自文件

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

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

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

于 2019-04-10T08:38:23.950 回答
1

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

{ _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' } } } ); 它将删除与该数字匹配的所有项目。在联系电话中

尝试阅读手册。

于 2021-12-08T04:36:59.433 回答
1

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

collection.update(
  { },
  { $pull: { 'contact.phone': { number: '+1786543589455' } } }
);
于 2020-10-10T14:57:30.913 回答
-2

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

于 2020-07-11T17:18:24.780 回答