mongodbの配列要素を削除するにはどうすればよいですか?


129

ここに配列構造があります

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

    ]
}

ここでは、mongo id(_id)と電話番号(+1786543589455)のみを知っており、対応する配列要素全体をドキュメントから削除する必要があります。つまり、phone配列のゼロのインデックス付き要素は電話番号と一致し、対応する配列要素を削除する必要があります。

contact: {
    phone: [
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }
    ]
}

以下の更新方法で試してみました

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

ただしnumber: +1786543589455、内部の配列オブジェクトから削除さ れ、phone配列のインデックス付き要素はゼロではありません。pullまた、成功せずに試してみました。

mongodbの配列要素を削除するにはどうすればよいですか?

回答:


237

次のクエリを試してください。

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

指定されたドキュメントを検索し、その配列から_id電話を削除します。+1786543589455contact.phone

を使用$unsetして配列の値を設定解除(に設定null)できますが、完全に削除することはできません。


3
ありがとうございました。それはうまくいきます。私は試した{ $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }し、{ $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }成功せず。ここで位置演算子の働きがわかりませんか?
ジャスティンジョン

1
これで折り返し電話はありますか?
Oliver Dixon

1
@iLoveUnicornsでは、3番目の引数としてコールバックを追加するか、返されたpromiseを使用できます。
Leonid Beschastny、2015

@LeonidBeschastny私はこれを試しました。私の場合、同じキーを持つ複数のドキュメントがあります。これらのすべてのドキュメントを$ pullしたいのですが、現在のクエリは1つのドキュメントのみを変更して停止します。どのような変更が必要ですか?
Shubham A.17年

1
@ShubhamA。デフォルトでは.update()、単一のドキュメントを更新します。複数のドキュメントを更新するには、{ multi: true }オプションを使用します。詳細はdb.collection.updateドキュメントを参照してください
Leonid Beschastny 2017

14

以下のコードは、電話番号が「+1786543589455」である配列から完全なオブジェクト要素を削除します

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

4

Mongooseの場合:ドキュメントから:

サブドキュメント配列からドキュメントを削除するには、_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から削除されます。

プルについて詳しくはこちらをご覧ください


0

Mongoose APIを使用してサブ/子オブジェクトをプルしようとしている場合:このドキュメントを お読みください編集が終わったら、save()を使用することを忘れないでください。そうしないと、変更がデータベースに保存されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.