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

Jus*_*ohn 117 mongodb

这是阵列结构

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

    ]
}
Run Code Online (Sandbox Code Playgroud)

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

contact: {
    phone: [
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试了以下更新方法

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

但它number: +1786543589455从内部数组对象中移除 ,而不是手机数组中的零索引元素.试图pull也没有成功.

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

Leo*_*tny 209

请尝试以下查询:

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

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

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

  • 谢谢.它很好用.我试过`{$ pull:{'contact.phone.$':{'contact.phone.$.number':'+ 1786543589455'}}}`和`{$ pull:{'contact.phone':{ 'contact.phone.$.number':'+ 1786543589455'}}}`没有成功.不明白位置操作员的工作吗? (2认同)
  • 这个有回电吗? (2认同)
  • @ShubhamA。默认情况下 `.update()` 更新单个文档。要更新多个文档,请使用“{ multi: true }”选项。有关详细信息,请参阅[`db.collection.update`文档](https://docs.mongodb.com/manual/reference/method/db.collection.update/)。 (2认同)

小智 12

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

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


小智 8

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

Collection.update({
    _id: parentDocumentId
  }, {
    $pull: {
      subDocument: {
        _id: SubDocumentId
      }
    }
  });
Run Code Online (Sandbox Code Playgroud)

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

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


Md *_*min 6

在 Mongoose 中:来自文档

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

contact.phone.pull({ _id: itemId }) // remove
contact.phone.pull(itemId); // this also works
Run Code Online (Sandbox Code Playgroud)

请参阅 Leonid Beschastny 的答案以获得正确答案。