sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man gör kapslade frågor i MongoDb som fungerar som kapslade Sql-selekteringsfrågor

Svaret på sådana frågor i MongoDB är ofta att denormalisera din data. Om du bara behöver en lista över användarna i gruppen kan du lagra användar-ID och användarnamnet i gruppdokumentet. På vissa sätt strukturerar du din databas efter det resultat du vill se på skärmen istället för att försöka sätta den i något normaliserat format.

Det skulle helt klart bara fungera om din användargruppslista (med namn) får plats i ett enda dokument, men ditt nuvarande tillvägagångssätt har också vissa begränsningar när det gäller den maximala storleken på en grupp.

Ett annat tillvägagångssätt skulle vara att lagra grupperna som en användare tillhör i en array på varje "Användar"-dokument. Lägg till ett index på det matrisfältet och nu kan du hitta användare efter grupp. Med tanke på att en användare sannolikt tillhör färre grupper än det finns medlemmar i en grupp kan detta vara den bästa metoden här.

db.user.save({_id:"u1", name:"u1 name", groups:[{_id:"g1", name:"Group One"}, ...]});

Återigen kan du lagra gruppnamnet med dess _id så att du omedelbart kan visa listan över grupper som en användare tillhör med en enda tur och retur. Naturligtvis, om du tillåter att ett gruppnamn ändras måste du starta en bakgrundsuppgift för att fixa alla dessa kopior av namnet.

Jag skulle också använda den inbyggda MongoDB-id-generatorn snarare än din egen, den har många önskvärda egenskaper.



  1. Hur man ökar befintligt värde i MongoDB

  2. Hur jämför man två strängar i mongoDB fjäderdata?

  3. MongoDB:locale::facet::_S_create_c_locale namn inte giltigt

  4. Använd javascript-variabeln som ett värde för $regex i MongoDB-frågan