2011-02-09 52 views
4

私はmongodbで新しく、配列内のいくつかの要素を削除します。そして最後の要素(06:00):mongodbの配列から要素を削除します

私の文書は、文書内

{ 
    "_id" : ObjectId("4d525ab2924f0000000022ad"), 
    "name" : "hello", 
    "time" : [ 
     { 
       "stamp" : "2010-07-01T12:01:03.75+02:00", 
       "reason" : "new" 
     }, 
     { 
       "stamp" : "2010-07-02T16:03:48.187+03:00", 
       "reason" : "update" 
     }, 
     { 
       "stamp" : "2010-07-02T16:03:48.187+04:00", 
       "reason" : "update" 
     }, 
     { 
       "stamp" : "2010-07-02T16:03:48.187+05:00", 
       "reason" : "update" 
     }, 
     { 
       "stamp" : "2010-07-02T16:03:48.187+06:00", 
       "reason" : "update" 
     } 
    ] 
} 

の下に、私は最初の要素(新しい理由を)削除したいよう。

mongoqueryを使用して、私はjava/phpドライバを使用していません。

+1

をPHPに変換あなたは答えの一つが正しいと思うならば、あなたはそれを受け入れる必要があります! – heinob

答えて

4

最後に削除する場合は{ $pop: { time: 1 } }、最後を削除する場合は{ $pop: { time : -1 } }として更新できます。しかし、それを処理するためのより良い方法があります。

+0

お返事ありがとうございました。これは私の助けになります。しかし、このクエリを使用する前にチェックしたい条件が1つあります。時間配列のサイズが3より大きければ条件です。時間配列のサイズを判断できません。あなたは何か考えていただけますか? – javaamtho

+0

@javaamthoクエリ条件部分については、[この回答](http://stackoverflow.com/questions/7811163/in-mongo-db-how-do-i-find-documents-where-array-size-is)を参照してください。 -greater-than-1/15224544#15224544)。 – JohnnyHK

0

@javaamtho 3より大きいサイズはテストできませんが、正確に3の場合のみ、x数値より大きいサイズの場合は、$inc演算子を使用し、フィールドを1または-1にしてください削除やアイテムを追加するときに私が正しくあなたを理解していた場合、あなたのサイズならば、配列の最初と最後の要素を削除する(、以下のようにアレイの外側time_countを別のフィールドを使用)

{ 
    "_id" : ObjectId("4d525ab2924f0000000022ad"), 
    "name" : "hello", 
    "time_count" : 5, 
    "time" : [ 
     { 
       "stamp" : "2010-07-01T12:01:03.75+02:00", 
       "reason" : "new" 
     }, 
     { 
       "stamp" : "2010-07-02T16:03:48.187+03:00", 
       "reason" : "update" 
     }, 
     { 
       "stamp" : "2010-07-02T16:03:48.187+04:00", 
       "reason" : "update" 
     }, 
     { 
       "stamp" : "2010-07-02T16:03:48.187+05:00", 
       "reason" : "update" 
     }, 
     { 
       "stamp" : "2010-07-02T16:03:48.187+06:00", 
       "reason" : "update" 
     } 
    ] 
} 
+0

正確にサイズ3を確認するには、$ sizeをお勧めしますか?どのように私は時間配列から正確に2番目の要素を削除するのですか?私はabt要素{ "スタンプ": "2010-07-02T16:03:48.187 + 03:00"、 "理由": "更新" } – javaamtho

+0

を話している@ジャバンソ最初の質問:要素の数を追跡して、$ inc演算子を使って++ itまたは - itと2番目の質問をするために、配列の外側にあるドキュメント内のフィールド:私は2番目の要素に対してちょうどtime.2を行うことができます。 $ unsetをするか、$にnullを設定してから$ nullをとる必要があるかもしれません。 – Bob

6

を追跡の配列の長さは3より大きい。これは、findAndModifyクエリを使用して行うことができます。 mongoシェルでは、次のコマンドを使用します:

db.collection.findAndModify({ 
    query: { $where: "this.time.length > 3" }, 
    update: { $pop: {time: 1}, $pop: {time: -1} }, 
    new: true 
}); 

これは、$ where句に一致するあなたのコレクション内のドキュメントを見つけるでしょう。 $ whereフィールドでは、任意の有効なjavascriptメソッドを指定できます。最初に一致したドキュメントにのみ更新が適用されることに注意してください。

また、次のドキュメントを見たいかもしれません:$ where句の詳細について

  1. http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-JavascriptExpressionsand%7B%7B%24where%7D%7Dを。
  2. http://www.mongodb.org/display/DOCS/Updating#Updating-%24pop 詳細$ pop。
  3. http://www.mongodb.org/display/DOCS/findAndModify+Command詳細については、findAndModifyの をご覧ください。
+0

パフォーマンス上の理由から '$ where'を使用するのは良い考えではありませんが、配列の長さに基づいてクエリを行う場合は、 –

0

これらの時間要素を残す場合は、mongo 2.2以降のaggregateコマンドを使用して、最小および最大時間要素を取得し、すべての時間要素を設定解除し、minおよびmaxバージョンをプッシュすることができます)ジョブを実行します。

smax=db.collection.aggregate([{$unwind: "$time"}, 
{$project: {tstamp:"$time.stamp",treason:"$time.reason"}}, 
{$group: {_id:"$_id",max:{$max: "$tstamp"}}}, 
{$sort: {max:1}}]) 

smin=db.collection.aggregate([{$unwind: "$time"}, 
{$project: {tstamp:"$time.stamp",treason:"$time.reason"}}, 
{$group: {_id:"$_id",min:{$min: "$tstamp"}}}, 
{$sort: {min:1}}]) 

db.students.update({},{$unset: {"scores": 1}},false,true) 

smax.result.forEach(function(o) 
{db.collection.update({_id:o._id},{$push: 
{"time": {stamp: o.max ,reason: "new"}}},false,true)}) 

smin.result.forEach(function(o) 
{db.collection.update({_id:o._id},{$push: 
{"time": {stamp: o.min ,reason: "update"}}},false,true)}) 
0

db.collection.findAndModify({ クエリ:{$: "> 3 this.time.length"}、 更新:{$ポップ:{時間:1 }、$ pop {time:-1}}、 new:true});

+0

同じアップデートオブジェクトで '$ pop'を2回使うことができないので、これはうまくいきません。 – JohnnyHK

関連する問題