【问题标题】:How to remove array element in mongodb?如何删除mongodb中的数组元素?
【发布时间】:2013-06-02 06:50:13
【问题描述】:

这里是数组结构

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,而不是在 phone 数组中删除零索引元素。尝试使用pull 也没有成功。

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

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    尝试以下查询:

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

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

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

    【讨论】:

    • 谢谢。它工作得很好。我尝试使用{ $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }{ $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } } 没有成功。不了解这里的位置运算符的工作原理?
    • 这个有回调吗?
    • @iLoveUnicorns 你可以添加一个回调作为第三个参数,或者你可以使用返回的承诺。
    • @LeonidBeschastny 我试过这个。就我而言,我有多个具有相同密钥的文档。我想 $pull 所有这些文档,但当前查询仅更改 1 个文档然后停止。我需要什么改变?
    • @ShubhamA。默认情况下.update() 更新单个文档。要更新多个文档,请使用 { multi: true } 选项。见db.collection.update docs for details
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      阅读更多关于拉here的信息。

      【讨论】:

        【解决方案4】:

        在猫鼬中: 来自document

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

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

        正确答案请参见 Leonid Beschastny 的回答。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

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

            尝试阅读手册。

            【讨论】:

            • 在传真号码和语音号码相同的问题中使用
            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2016-02-25
              • 1970-01-01
              • 2020-04-16
              • 1970-01-01
              相关资源
              最近更新 更多