2012-03-16 22 views
4

私はMongoDBの中で、このような文書を持っている:mongodb配列から最初のn個の要素を削除するには?

{uid:1212, outbox: 
[ 
    {msg1}, 
    {msg2}, 
    {msg3}, 
    ... 
    {msgN} 
] 
} 
 
I want atomically remove first n elements from array outbox. 

I know two ways to remove element from array 
1) $pop 
    But it removes only one element 
2) {$unset:{outbox.0:1}} after {$pull:{outbox:null}} 
    But it non atomic and removes only one element 

更新 これは現時点では不可能である

答えて

4

私はあなたがこのようにそれを行うことができると思います。

db.data.update(
    {uid:1212}, 
    db.data.findOne({uid:1212}, {outbox: {$slice: [2,2]}, uid: 1, _id: 0 }) 
); 

これをレコード全体を効果的に新しいデータで置き換えることになるので、少し慎重にする必要があります。数字を正しく取得するためには、送信トレイ配列の長さを知る必要があります。つまり、$ sliceオプションは2レコードをスキップし、この場合は次の2レコードを返します。 2つをスキップして残りのアイテムを返す方法はないようです。

最初の部分{uid:1212}は操作をその単一のドキュメントに限定し、2番目の部分はノードを返しますが、それらの配列要素のサブセットを返し、更新用のデータとして使用されます。ここで$スライス上

さらに詳しい情報:http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements

はあなたのためにその仕事でしょうか?

関連する問題