sql >> Database >  >> NoSQL >> MongoDB

MongoDB Match een array met $type?

Eigenlijk staat er een "gotcha" vermeld in de documentatie voor $type specifiek over arrays:

Wanneer toegepast op arrays, komt $type overeen met elk innerlijk element dat van het opgegeven type is. Zonder projectie betekent dit dat de hele array overeenkomt als een element het juiste type heeft. Met projectie zullen de resultaten alleen die elementen van het gevraagde type bevatten.

Dus dat betekent dat in plaats van te detecteren of het "element zelf" zich in de array bevindt, wat feitelijk wordt getest het "binnenste element" van de array is om te zien welk type het is.

Nu suggereert de documentatie zelf deze JavaScript-test met $where :

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

Maar ik vind dat behoorlijk afschuwelijk, want er is een betere manier.

De truc is in "dot-notatie", waar je om de 0 . vraagt indexelement van de array naar $exists

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

Dat is gewoon het basisgeval dat als het "0e" element bestaat, het veld aanwezig is en de gegevens daarom een ​​array zijn.

Als je eenmaal dat logische uitgangspunt begrijpt, is het een vrij eenvoudige test. Het enige dat daarmee niet kan worden geëvenaard, is een "echt lege" array, in welk geval u indien nodig kunt terugvallen op het JavaScript-alternatief. Maar dit kan een index gebruiken, dus het zou de voorkeur hebben om de laatste vorm te gebruiken.



  1. Aanhoudend Python-object in het geheugen voor nginx/uwsgi-server

  2. Aan de slag met MongoDB en Mongoose

  3. ClusterControl - Geavanceerd back-upbeheer - MongoDB

  4. MongoDB-veldvolgorde en documentpositie wijzigen na update