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

时间:2013-06-06 09:58:19

标签: 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,而不是在电话数组中删除零索引元素。试图pull也没有成功。

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

6 个答案:

答案 0 :(得分:188)

尝试以下查询:

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

它会找到包含_id的文档,并从+1786543589455数组中删除手机contact.phone

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

答案 1 :(得分:11)

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

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

答案 2 :(得分:3)

在猫鼬中: 来自document

  

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

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

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

答案 3 :(得分:2)

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

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

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

详细了解拉力here

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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