MongoDB dotaz vrátit dokumenty na základě velikosti pole po filtrování pole JSON objektů?

0

Otázka

Mám MongoDB dokumenty strukturována tímto způsobem:

[
  {
    "id":  "car_1",
    "arrayProperty": [
      {
        "model": "sedan",
        "turbo": "nil"
      },
      {
        "model": "sedan",
        "turbo": "60cc"
      }
    ]
  },
  {
    "id":  "car_2",
    "arrayProperty": [
      {
        "model": "coupe",
        "turbo": "50cc"
      },
      {
        "model": "coupe",
        "turbo": "60cc"
      }
    ]
  }
]

Chci být schopen, aby se najít dotaz, který se promítá do základní angličtiny jako "Ignoruje všechny modely, které mají "žádné" hodnotu "turbo", vrátit všechny dokumenty s arrayProperty délky X." To znamená, "arrayProperty" auto 1 by být interpretován jako velikost 1, zatímco pole auto 2 bude mít velikost 2. Cílem je být schopen provést dotaz pro všechny vozy s arrayProperty velikost 2 a jen vidět auta 2 se vrátil ve výsledcích.

Bez ohledu na nulové hodnoty, dotaz je velmi jednoduchý:

{ arrayProperty: { $size: 2} }

A to by se vrátit oba vozy 1. a 2. Navíc, pokud naše pole bylo jen jednoduché pole jako:

[1,2,3,'nil]

Pak náš dotaz je jednoduše:

{
  arrayProperty: {
    $size: X,
    $ne: "nil"
  }
}

Nicméně, když jsme se představit pole JSON objektů, se věci složitější. Snažil jsem se mnoho věcí bezvýsledně, včetně:

  "arrayProperty": {
    $size: 2,
    $ne: {"turbo": "nil"}
  }

  "arrayProperty": {
    $size: 2,
    $ne: ["arrayProperty.turbo": "nil"]
  }

I bez $size provozovatel tam, nemůžu filtrovat podle hodnoty nil. Ví někdo, jak bych správně dělat to v ty poslední dva dotazy?

aggregation arrays mongodb
2021-11-18 02:18:59
1

Nejlepší odpověď

0

použití $and v $match

db.collection.aggregate([
  {
    $match: {
      "$and": [
        {
          arrayProperty: {
            $size: 2
          }
        },
        {
          "arrayProperty.turbo": {
            $ne: "nil"
          }
        }
      ]
    }
  }
])

mongoplayground


použití $set první

db.collection.aggregate([
  {
    "$set": {
      "arrayProperty": {
        "$filter": {
          "input": "$arrayProperty",
          "as": "a",
          "cond": {
            $ne: [
              "$$a.turbo",
              "nil"
            ]
          }
        }
      }
    }
  },
  {
    $match: {
      arrayProperty: {
        $size: 1
      }
    }
  }
])

mongoplayground


nastavit nové pole velikost

db.collection.aggregate([
  {
    "$set": {
      "size": {
        $size: {
          "$filter": {
            "input": "$arrayProperty",
            "as": "a",
            "cond": {
              $ne: [
                "$$a.turbo",
                "nil"
              ]
            }
          }
        }
      }
    }
  },
  {
    $match: {
      size: 1
    }
  }
])

mongoplayground

2021-11-18 03:53:28

Zatímco toto dělá návrat správné auto pro tento konkrétní dotaz, hledám pro dotaz, který by také vrátit auto 1 pokud jsme specifikovali velikost jako 1. Nápad tady je, že pokud by "turbo" je "nula" pak jsme se prostě nepočítá, že ve velikosti. Je to možné?
Will H

Jsem aktualizovat svou odpověď
YuTing

V pohodě, myslím, že mohu použít $expr použití v find {} dotazů příliš, jako je agregace logiku. Můžu se zeptat, jestli můžete vidět, jak, kde "nulová" hodnota by stále být zahrnuty, když jsme dotaz na velikost 1? Vidím, že to je doslova odstraněny. Možná, že to není možné, jen se ptám.
Will H

Jsem aktualizovat svou odpověď
YuTing

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................