MongoDB обикновено не е подходящ за моделиране на графични отношения. Има специализирани бази данни с графики, които се справят отлично с тази задача.
Въпреки това, когато не искате да добавите друга технология за бази данни към микса, бих препоръчал да създадете нова колекция frienships
и моделирайте всяка приятелска връзка като документ с масив от два записа, всеки от които е обект със съкратена информация за един от потребителите, който ви е необходим, за да покажете запис във вашите списъци с приятели:
{
friendship: [
{
id:123,
name: "Bob",
avatar: "Bob.jpg"
},
{
id:456,
name: "Alice",
avatar: "Alice.jpg"
}
]
}
Причината за дублиране на информация от потребителските документи в документите за приятелство е да се избегне второ запитване към потребителската колекция, за да се получат всички данни за показване на потребителски списък с приятели. MongoDB не може да прави JOINs може да изпълнява JOIN само върху неразделени колекции
, така че трябва да избягвате разпространението на данни, от които се нуждаете за конкретен случай на употреба, върху множество колекции, дори когато това означава, че създавате излишъци. В противен случай ще трябва да изпълнявате множество заявки една след друга, което значително забавя времето за отговор на вашето приложение.
Когато искате да получите списъка с приятели на потребител 123, трябва да извършите db.friendships.find({"friendship.id", 123})
(индекс на friendship.id
ще подобри производителността) и след това получавате списък с документи, където Боб е или първият, или вторият приятел.
След това ще повторите тези документи и ще изведете кратката информация за записа в масива, който не потребител 123.
Като алтернатива можете да филтрирате Bob-записите в базата данни с тръбопровод за агрегиране. Използвайте заявката $match по-горе, $unwind приятелския масив и след това $match тези документи, където id не е 123. Това би било компромис:спестявате честотна лента за сметка на натоварването на процесора на сървъра на базата данни.
За да попитате дали вече съществува приятелска връзка, използвайте:
db.friendships.find( { $and: [
{ "friendship.id": 123 },
{ "friendship.id": 456 }
] } ).count();