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

条件に一致するネストされた配列の最初の要素を検索します

    $ whereを使用して検索するのが最適です。 通常のクエリに加えて、サーバー上に物事を保持します:

    db.getCollection('collection').find({
      "array": {
        "$elemMatch": { "field": "BCD", "enabled": "true" },
      },
      "$where": function() {
        return this.array.map((e,i) => Object.assign(e,{ i }))
          .filter( e => e.field === "BCD" && e.enabled === "true" )
          .map( e => e.i )[0] <=
        this.array.map(e => e.enabled).indexOf("true")
      }  
    })
    

    また、 $indexOfArray および $ range 、その後は長く見えるかもしれませんが、実際には$を使用すると最も効率的です。編集

    db.getCollection('collection').aggregate([
      { "$match": {
        "array": {
          "$elemMatch": { "field": "BCD", "enabled": "true" },
        }
      }},
      { "$redact": {
        "$cond": {  
          "if": {
            "$lte": [
              { "$arrayElemAt": [
                { "$map": {
                  "input": {
                    "$filter": {
                      "input": {
                        "$map": {
                          "input": {
                            "$zip": {
                              "inputs": [
                                "$array",
                                { "$range": [0, { "$size": "$array" }] }
                              ]
                            }    
                          },
                          "as": "a",
                          "in": {
                            "field": { "$arrayElemAt": [ "$$a.field", 0 ] },
                            "enabled": { "$arrayElemAt": [ "$$a.enabled", 0 ] },
                            "index": { "$arrayElemAt": [ "$$a", 1 ] }    
                          }
                        }
                      },
                      "as": "a",
                      "cond": {
                        "$and": [
                          { "$eq": [ "$$a.field", "BCD" ] },
                          { "$eq": [ "$$a.enabled", "true" ] }
                        ]
                      }    
                    }
                  },
                  "as": "a",
                  "in": "$$a.index"  
                }},
                0
              ]},
              { "$indexOfArray": [ "$array.enabled", "true" ] } 
            ] 
          },
          "then": "$$KEEP",
          "else": "$$PRUNE"
        }
      }}
    ])
    

    したがって、それを強制する実際のクエリ操作は実際にはありませんが、どちらの場合も、データをネットワーク経由でクライアントに送信してからフィルタリングするのではなく、「サーバー上」で選択を維持します。

    そうすると、そもそもデータベースを使用する目的が無効になるからです。したがって、これをサーバー上で実行する必要があります。



    1. mongodbアグリゲーションフレームワークで合計を行う

    2. MongoJsonスキーマバリデーターAnyOfが機能していません

    3. MongoDB + Java:ユーザードキュメントにクレデンシャルがありません

    4. MongoDB集約フレームワークを使用して配列サイズのヒストグラムを取得する最速の方法