MongoDB dotaz vrátit vše na základě velikosti pole po filtrování pole?

0

Otázka

Snažím se vytvořit šablonu pro Mongo najít dotaz, který vrátí všechny, které odpovídají dané velikosti pole vlastnost. Například, toto je dotaz, najít všechny dokumenty, které obsahují pole o velikosti 5:

{ arrayProperty: { $size: 5} }

Problém: některé z těchto polí mají hodnotu "nula" a nechci, aby tyto hodnoty se počítají při dotazu na velikost. Například bych jako dokument obsahující pole strukturované, jako je tento, aby být vrácena při dotazu na velikost 5:

[0,1,2,3,"nil"]

Já jsem už něco dělat, jako je to v rámci agregace:

  [
      {
         $project: {
            item: 1,
            numberOfItems: { $size: {
              $filter: {
                input: "$arrayProperty",
                cond: { $ne: [ "$$this", "nil" ] }
              }
            }
            }
         }
      }
   ]

To je počítání délky/velikosti jednotlivých polí a tlačí to číslo do pole s názvem numberOfItems. Myslím, že budu muset projít filtrované výsledky $size provozovatelem. Nemůžu zdá se přijít na to, jak využít to v najít syntaxi dotazu a když jsem zoufale o pomoc.

Myšlenka mám na mysli pro flow jsem popsal, je něco takového, i když to není platné:

    {$expr:{
      $filter: {
        input: "$arrayProperty",
        cond: { $ne: [ "$$this", "nil" ] }
      }: { $size: 5 }
    }}

Může někdo pomoci mi? Jak mám správně projít filtrovaný výsledek $size provozovatel? Nemohu najít žádné další otázky/odpovědi, kde se lidé snažili udělat něco takového.

Jiná situace je, když je "nulová" je vnořená jako hodnoty v JSON objekt v matici, což vím, že bude vyžadovat jiné řešení. Příklad:

[
  {
    "arrayProperty": [
      {
        "model": "sedan",
        "turbo": "nil"
      },
      {
        "model": "sedan",
        "turbo": "60cc"
      }
    ]
  },
  {
    "arrayProperty": [
      {
        "model": "coupe",
        "turbo": "50cc"
      },
      {
        "model": "coupe",
        "turbo": "60cc"
      }
    ]
  }
]
aggregation find mongodb size
2021-11-17 19:01:26
1

Nejlepší odpověď

1

Můžete jen zkusit $ne stav spolu $size stav,

db.collection.find({
  arrayProperty: {
    $size: 5,
    $ne: "nil"
  }
})

Dětské hřiště


Jiná situace je, když je "nulová" je vnořená jako hodnoty v JSON objekt v matici, což vím, že bude vyžadovat jiné řešení.

db.collection.find({
  "arrayProperty.turbo": {
    $ne: "nil"
  },
  arrayProperty: {
    $size: 2
  }
})

Dětské hřiště

2021-11-18 05:40:18

To je perfektní, děkuji. Mohu udělat ještě víc, a zeptat se, jak bys to udělal, kdyby "nil" je ve vnořené JSON objekt? Moje experimentování vede k všechny výsledky stále vrací, tady je ukázka: mongoplayground.net/p/8HoS1ZJNW5b Bude upravovat původní otázce se to stejně pro budoucí diváky.
Will H

k testování sub-poli dokument použít tečka notaci. Také si všimněte, pravděpodobně nečekané vyloučení 3. volba v tomhle: mongoplayground.net/p/0nx7au-xPrM
Joe

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ý
..................................................................................................................