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


129

这是数组结构

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中删除数组元素?

Answers:


237

请尝试以下查询:

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

它将查找给定的文档,_id并将手机+1786543589455从其contact.phone阵列中删除。

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


3
谢谢。很好用 我试着用{ $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }{ $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }没有取得成功。这里不了解位置操作员的工作吗?
贾斯汀·约翰

1
有回电话吗?
奥利弗·迪克森

1
@iLoveUnicorns您可以将回调添加为第三个参数,也可以使用返回的Promise。
Leonid Beschastny

@LeonidBeschastny我尝试了这个。就我而言,我有多个使用相同密钥的文档。我想$ pull所有这些文档,但是当前查询仅更改1个文档,然后停止。我需要什么改变?
Shubham A.

1
@ShubhamA。默认情况下.update()更新单个文档。要更新多个文档,请使用{ multi: true }选项。有关db.collection.update详细信息,请参阅文档
Leonid Beschastny

14

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

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

4

在猫鼬中:从文档中

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

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

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


3

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

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

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

在这里阅读更多关于pull的信息


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.