sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB Match et array med $type?

Faktisk er der en "gotcha" angivet i dokumentationen for $type specifikt om arrays:

Når det anvendes på arrays, matcher $type ethvert indre element, der er af den angivne type. Uden projektion betyder det, at hele arrayet vil matche, hvis et element har den rigtige type. Med projektion vil resultaterne kun omfatte de elementer af den ønskede type.

Så det betyder, at i stedet for at opdage, om selve "elementet" er i array, er det, der faktisk testes, det "indre element" af arrayet for at se, hvilken type det er.

Nu foreslår selve dokumentationen denne JavaScript-test med $where :

.find({ "$where": "return Array.isArray(this.author)" })

Men jeg synes, det er ret forfærdeligt, da der er en bedre måde.

Tricket er i "dot notation", hvor du beder om 0 indekselement af arrayet til $exists

.find({ "author.0": { "$exists": true } })

Hvilket blot er det grundlæggende tilfælde, at hvis elementet "0." eksisterer, er feltet til stede, og dataene er derfor en matrix.

Når du først forstår den logiske forudsætning, er det en ret simpel test. Det eneste, der ikke kan matches med det, er et "virkelig tomt" array, i hvilket tilfælde du kan falde tilbage til JavaScript-alternativet, hvis det er nødvendigt. Men dette kan faktisk bruge et indeks, så det ville være foretrukket at bruge sidstnævnte form.



  1. Spring data tilsidesætter standard serializer igen

  2. Redis vs. Memcached

  3. Den bedste måde at hoste MongoDB på DigitalOcean

  4. Hvor står mongodb i CAP-sætningen?