这是数组结构

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

#1 楼

请尝试以下查询:

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


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

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

评论


谢谢。很好用我尝试使用{$ pull:{'contact.phone。$':{'contact.phone。$。number':'+1786543589455'}}}和{$ pull:{'contact.phone':{'contact。 phone。$。number':'+1786543589455'}}}失败。这里不了解位置操作员的工作吗?

–贾斯汀·约翰(Justin John)
2013年6月6日上午10:46

有回电话吗?

–奥利弗·迪克森(Oliver Dixon)
2015年9月1日于17:34

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

–莱昂尼德·贝斯卡斯特尼(Leonid Beschastny)
2015年9月1日于17:46

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

–Shubham A.
17年5月5日在5:13

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

–莱昂尼德·贝斯卡斯特尼(Leonid Beschastny)
17年9月6日在16:50

#2 楼

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

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


#3 楼

在Mongoose中:
从文档中:


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



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


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

#4 楼

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

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


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

在此处详细了解关于pull的信息。

#5 楼

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

#6 楼

要删除所有数组元素,而不论给定的id如何,请使用以下命令:
collection.update(
  { },
  { $pull: { 'contact.phone': { number: '+1786543589455' } } }
);