MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongoose:Как да попълвам дълбока популация от 2 нива, без да попълвам полета от първо ниво? в mongodb

Като запален фен на mongodb, предлагам ви да използвате релационна база данни за силно релационни данни - това е, за което е създадена. Вие губите всички предимства на mongodb, когато трябва да извършите 3+ заявки, за да получите един обект.

Баууууу , знам, че този коментар ще остане глух. Най-добрият ви залог е да бъдете възможно най-съзнателни относно представянето. Първата ви стъпка е да ограничите полетата до необходимия минимум. Това е просто добра практика дори при основни заявки и всички машина за бази данни - получавайте само полетата, от които се нуждаете (напр. SELECT * FROM ===лошо... просто спри да го правиш!). Можете също така да опитате да правите щадящи заявки, за да спестите много работа след обработка, която mongoose върши с данните. Не съм тествал това, но трябва да работи...

SchemaA.find({}, 'field1 fieldB', { lean: true })
.populate({
    name: 'fieldB',
    select: 'fieldC',
    options: { lean: true }
}).exec(function (err, result) {
    // not sure how you are populating "result" in your example, as it should be an array, 
    // but you said your code works... so I'll let you figure out what goes here.
});

Също така, много "монго" начин да направите това, което искате, е да запазите препратка в SchemaC обратно към SchemaA. Когато казвам "монго" начин да го направите, трябва да се откъснете от годините си на мислене за заявки за релационни данни. Направете каквото е необходимо, за да извършите по-малко заявки в базата данни, дори ако това изисква двупосочни препратки и/или дублиране на данни.

Например, ако имах схема за книга и схема за автор, вероятно щях да запазя името и фамилията на авторите в колекцията Книги, заедно с препратка _id към пълния профил в колекцията Автори. По този начин мога да зареждам книгите си в една заявка, все пак да показвам името на автора и след това да генерирам хипервръзка към профила на автора:/author/{_id} . Това е известно като „денормализиране на данни“ и е известно, че причинява на хората киселини. Опитвам се да го използвам върху данни, които не се променят много често - като имената на хората. В случай, че името се промени, е тривиално да се напише функция за актуализиране на всички имена на множество места.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose.aggregate(pipeline) свързва множество колекции с помощта на $unwind, $lookup, $group

  2. Как да използвам Javascript обект в конвейера за агрегиране на mongodb?

  3. Многоключови индекси на MongoDB и граници на пресичане на индекси

  4. Mongodb грешка при стартиране

  5. Mongoose findById() в обект от вложени схеми/поддокументи - агрегиране