MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Temukan elemen pertama dalam array bersarang yang cocok dengan kondisi

Sebaiknya menelusuri menggunakan $where selain kueri normal, dan masih menyimpan sesuatu di server:

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")
  }  
})

Dan jika Anda memiliki MongoDB 3.4 dengan dukungan untuk $indexOfArray dan $range , maka mungkin terlihat lebih lama tetapi sebenarnya paling efisien dengan $redact :

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"
    }
  }}
])

Jadi sebenarnya tidak ada operasi kueri aktual yang memberlakukannya, tetapi kedua kasus ini tetap memilih "di server" sebagai lawan mengirim data melalui kabel ke klien dan kemudian memfilter.

Karena jika Anda melakukannya, itu meniadakan tujuan penggunaan database sejak awal. Jadi Anda benar-benar ingin ini terjadi di server.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB + Aplikasi Web:Basis Data per pengguna

  2. Memulai dengan MongoDB dan Mongoose

  3. Bagaimana saya bisa menggunakan variabel regex dalam kueri untuk MongoDB

  4. Apa yang akan menjadi driver MongoDB C# yang setara dengan kueri berikut menggunakan operator pembaruan array $[<identifier>]

  5. Apa tipe pengembalian db.collection.find() di mongodb