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

И ако имате MongoDB 3.4 с поддръжка за $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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Вложен масив $pull заявка с помощта на C# MongoDB драйвер

  2. Управление на множество технологии за бази данни с ClusterControl

  3. Как да извърша еднократно синхронизиране на DB с друга DB в MongoDB?

  4. Заявка за агрегиране на MongoDB за преброяване

  5. премахнете 0 стойности, ако 0 е последвано от>=1 от масиви в MongoDB