2017-05-23 11 views
1

ボランティア情報を含むコレクションがあり、ボランティアがオブジェクトの配列としてリストされています。私は、各志願者のためのすべてのシフトを表示することができますが、配列から1を除去することは、私にとっては難しい証明されていますオブジェクトのネストされた配列からオブジェクトを削除するmongodb

サンプルデータを:

"_id" : ObjectId("59180305c19dbaa4ecd9ee59"), 
    "where" : "Merchandise tent", 
    "description" : "Sell gear at the merchandise tent.", 
    "shifts" : [ 
      { 
        "dateNeeded" : ISODate("2017-06-23T00:00:00Z"), 
        "timeslot" : "8:00 - NOON", 
        "needed" : 2, 
        "_id" : ObjectId("591807546a71c3a57d1a2105"), 
        "volunteers" : [ 
          { 
            "fullname" : "Mary Mack", 
            "phone" : "1234567890", 
            "email" : "[email protected]", 
            "_id" : ObjectId("591ce45bc7e8a8c7b742474c") 
          } 
        ] 
      }, 

私はこのために利用可能なデータがある: _id、どこで、 shiftts.dateNeeded、volunteers.email

誰かが私を助けることができますか?メアリーマックが商品テントで8時の正午のためにボランティアをしたくないと言いましょう。彼女は他のシフトの下にもリストされているかもしれませんが、私たちはこのシフトから彼女を取り除きたいだけです。

+0

@ D-reaper質問には、角度とjavascriptのタグが間違っていました。実際にはMongoDBの操作について尋ねています。 –

+0

私はangularjsとmongodbを使用していると考え、anglejを使って配列を更新してから変更を提出する方法があるかどうか、あるいはmongodbを通してすべてをやらなければならないかどうかはわかりませんでした。私はいくつかの方法があると確信しています、いいえ? – user3561890

+0

実際にデータベースを更新するには? MongoDBにコマンドを発行する必要があります。クライアントでの配列操作では、データベースは更新されません。 –

答えて

2

を試してみてください。その後$pullと一致する配列のインデックスのためのpositional $ operatorを適用する:あなたが唯一の入れ子構造の「外側」アレイ上の「一致」しようとしていると$pullがクエリの引数を持っているので、この場合は大丈夫です

db.collection.update(
{ "_id": ObjectId("59180305c19dbaa4ecd9ee59"), "shifts.timeslot": "8:00 - NOON" }, 
{ "$pull": { "shifts.$.volunteers": { "fullname": "Mary Mack" } } } 
) 

削除する配列エントリを特定するのは自分のものです。

あなたは本当に "ネストされた配列"を使用することに注意する必要があります。このような操作は$pullのように動作しますが、positional $ operatorは条件を満たす「最初の」要素にのみ一致するため、内部配列への更新は実際には不可能です。したがって、複数のシフトでの "Mary Mack"の例は、最初に見つかった "シフト"配列エントリでのみ一致します。

+0

ありがとうございます!私は試していて、近くにいたが、それがうまくいくかどうかはわからなかった。私はanglejsで配列をスプライスしてから更新できると思っていましたが、それはとても複雑に思えました。 – user3561890

+0

@ user3561890クライアントの配列を操作して詳細を保存することができますが、そうするのはあまり安全ではありません。他のプロセスがデータを更新し、それらのアクションを上書きする実際の環境では、リスクを実行します。ここで取り除くべきもう一つのことは、ネストされた配列が最良のデザインパターンではないことに気づいています。私はボランティアのリストを各シフトに埋め込むのではなく、 "ボランティア"のトップレベルのリストに "シフト"情報を含めるようにあなたの構造を "平坦化"します。 –

+0

Neilに感謝します。それは役に立ちます。私は多くのコードをフロントエンドからバックエンドに変換しようとしています。 – user3561890

1

は、あなたが「文書」と.update()のためのクエリ式のように、必要な「シフト」配列のエントリと一致するものを指定することでこれを行うことができ、この

db.example.update(
{}, 
{ $unset: {"Mary Mack":1}}, 
false, true 
) 
+1

'$ unset'はドキュメントプロパティを削除します。 OPはアレイからエントリを削除するように要求しています –

+0

これは本当です。私は間違いなくオブジェクト全体をアレイから取り除きたいと思っていましたが、私はその考えを感謝しています。 – user3561890

+0

単なるコードブロックを掲示するのではなく、質問者の質問に対する答えと思われる理由を説明することは有益でしょう。 –

関連する問題