sql >> データベース >  >> NoSQL >> MongoDB

MongoDB $ allElementsTrue

    MongoDBでは、$allElementsTrue 集計パイプライン演算子は、配列をセットとして評価し、trueを返します。 配列内にfalseの要素がない場合 。

    配列にfalseの要素が含まれている場合 、次に$allElementsTrue falseを返します 。

    配列の要素はtrue falseでない場合 、null0 、またはundefined

    次のドキュメントを含むコレクションがあるとします。

    { "_id" : 1, "data" : [ 1, 2, 3 ] }

    このドキュメントには配列が含まれています。

    $allElementsTrueを使用して次のクエリを実行できます 配列にfalseの要素が含まれているかどうかを確認します :

    db.test.aggregate(
       [
         { $project: { 
            _id: 0,
            allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
             }
       ]
    )

    結果:

    { "allElementsTrue" : true }

    この場合、どの配列要素もfalseではありません。 、したがって、trueの結果が得られます 。

    配列にFalseが含まれている場合

    次のドキュメントをコレクションに追加しましょう:

    { "_id" : 2, "data" : [ true, false ] }

    そして、$allElementsTrueを実行してみましょう その文書に対して:

    db.test.aggregate(
      [
        { $match: { _id: 2 } },
        { $project: { 
          _id: 0,
          allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
            }
      ]
    )

    結果:

    { "allElementsTrue" : false }

    今回はfalseを取得します 、trueである別の要素がある場合でも 。 $allElementsTrueであるため、これは予想されることです。 falseを返します falseである要素が少なくとも1つあるときはいつでも 、他の要素がいくつ真であるかに関係なく。

    空のアレイ

    空の配列はtrueを返します 。

    コレクションに次のドキュメントを追加するとします。

    { "_id" : 3, "data" : [ ] }

    このドキュメントには空の配列が含まれています。

    それでは、$allElementsTrueを実行してみましょう。 もう一度:

    db.test.aggregate(
      [
        { $match: { _id: 3 } },
        { $project: { 
          _id: 0,
          allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
            }
      ]
    )

    結果:

    { "allElementsTrue" : true }

    予想どおり、trueを返します 。

    ヌル、0、および未定義の値

    $allElementsTrueというのは完全に真実ではありません falseと評価されます のみ 配列にfalseが含まれている場合 。

    $allElementsTrue 演算子もfalseと評価されます 配列にnullが含まれている場合 、0 、またはundefined 値。

    コレクションに次のドキュメントを追加するとします。

    { "_id" : 4, "data" : [ 1, null, 3 ] }
    { "_id" : 5, "data" : [ 1, undefined, 3 ] }
    { "_id" : 6, "data" : [ 0, 1, 2 ] }

    各ドキュメントの配列には、nullのいずれかの要素が含まれています 、0 、またはundefined

    それでは、$allElementsTrueを実行してみましょう。 それらの文書に対して:

    db.test.aggregate(
      [
        { $match: {_id: { $in: [4,5,6] }} },
        { $project: { 
          allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
            }
      ]
    )

    結果:

    { "_id" : 4, "allElementsTrue" : false }
    { "_id" : 5, "allElementsTrue" : false }
    { "_id" : 6, "allElementsTrue" : false }

    すべてのドキュメントはfalseを返します 予想通り。

    ネストされた配列

    配列にfalseの要素を含むネストされた配列が含まれている場合 、それでは$allElementsTrueには十分ではありません falseを返す 。 $allElementsTrueまで 懸念されるのは、ネストされた配列が要素であるため、falseではないということです。 。

    私が何を意味するかを示すために、次のドキュメントを挿入するとします。

    { "_id" : 7, "data" : [ 1, [ false ], 3 ] }
    { "_id" : 8, "data" : [ 1, [ false ], false ] }

    それでは、$allElementsTrueを実行してみましょう。 これらの2つのドキュメントに対して:

    db.test.aggregate(
      [
        { $match: {_id: { $in: [7,8] }} },
        { $project: { 
          allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
            }
      ]
    )

    結果:

    { "_id" : 7, "allElementsTrue" : true }
    { "_id" : 8, "allElementsTrue" : false }

    最初のドキュメントがtrueを返したことがわかります 2番目に返されたfalse

    これは、最初のドキュメントでfalseが 値は別の配列内にネストされているため、falseとしてカウントされません 値(つまり、配列自体が値です)。

    ただし、2番目のドキュメントにも配列要素の1つとしてfalseが含まれているため、その値が$allElementsTrueの原因になります。 falseに評価する 。


    1. 辞書<文字列、オブジェクト>からBsonDocumentへの変換(_tフィールドを省略)

    2. MongoDBアトミックfindOrCreate:findOne、存在しない場合は挿入しますが、更新しません

    3. UUIDの短縮

    4. TransactionRequiredException更新/削除クエリの実行