2012-05-03 8 views
4

に配列フィールドのサイズ3未満でドキュメントを削除私は今、私は、配列のどのsizeでコレクションcolから文書を削除するこのMongoDBの

{ 
    { 
    intField:123, 
    strField:'hi', 
    arrField:[1,2,3] 
    }, 

    { 
    intField:12, 
    strField:'hello', 
    arrField:[1,2,3,4] 
    }, 

    { 
    intField:125, 
    strField:'hell', 
    arrField:[1] 
    } 
} 

のように見える文書を持っているcolという名前のMongoDBのコレクションを持っていますフィールドが2未満

あるので、私は今、この本

db.col.remove({'arrField':{"$size":{"$lt":2}}}) 

のように見えるのクエリを書きましたクエリは何もしません。私はdb.col.find()とチェックし、すべての文書を返します。このクエリで何が間違っていますか?

$sizeのドキュメントから

答えて

5

:(:1つの以上の要素を持つ配列など)あなたはサイズの範囲を見つけるために、$サイズを使用することはできません

ドキュメントでは、このようなことを試してみたい場合は、配列内のアイテムの数と別のサイズフィールド(この場合はarrFieldSize)を維持することをお勧めします。

4

一部のクエリでは、(n)または条件を使用して、または除外するすべてのカウントを一覧表示することができます。あなたがこれを行うには、条件オブジェクトキーで数値インデックスを使用することができます2.2 + MongoDBので

db.col.find({ 
    "$or": [ 
    { "arrField": {"$exists" => false} }, 
    { "arrField": {"$size" => 1} }, 
    { "arrField": {"$size" => 0} } 
    ] 
}) 
+0

しかし、受け入れられた答えによると、これは動作しないように、$ sizeを範囲問合せできません。 – UpTheCreek

+1

これは絶対に動作します。これはネイティブレンジクエリではなく、興味のあるすべての$ size値の単純な古いOR演算です。 「arrField $ size 0-2のすべての文書を私に渡す」と言うのではなく、「arrField $ size 0、arrField $ size 1、arrField $ size 2」のすべての文書を要求することができます。明らかに、これはあなたが興味のある$ size値の範囲が小さい場合にのみ実行可能ですが、そのような場合はarrFieldSizeカウンタなどを追加するよりもうまく機能し、便利かもしれません。 –

+0

申し訳ありません - 私の間違い。あなたが編集をすると、私は前に答えを与えたdownvoteを削除することができます。 – UpTheCreek

3

:あなたの例では

、次の問合せは、以下の2つの配列エントリですべての文書を与える

db.col.remove({'arrField.2': {$exists: 0}}) 

arrFieldに少なくとも3つの要素が含まれていないドキュメントは削除されます。