Я только начал пытаться выучить mongodb. Но у меня проблема с формированием запроса, по которому мой клиент может позвонить.
У меня есть схема профиля и схема друзей. Цель состоит в том, чтобы получить всех друзей по objectId. Но есть кое-что, что я делаю совершенно неправильно.
Схема профиля
const profileSchema = new mongoose.Schema({
username: {type: String, required: true},
uid: {type: String, required: true},
level: {type: String, default: "1"},
exp: {type: String, default: "1"},
wins: {type: String, default: "0"},
draws: {type: String, default: "0"},
lost: {type: String, default: "0"},
gems: {type: String, default: "0"},
profilePicture: {type: String, default: "p1"},
rating: {type: String, default: "400"},
friends: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Friends'}]
});
Схема друзей
const friendsSchema = new mongoose.Schema({
requester: { type: mongoose.Schema.Types.ObjectId, ref: 'Profiles'},
recipient: { type: mongoose.Schema.Types.ObjectId, ref: 'Profiles'},
status: {
type: Number,
enums: [
0, //'add friend',
1, //'requested',
2, //'pending',
3, //'friends'
]
}
}, {timestamps: true}
Агрегированный вызов mongoDb
async function getAllFriendsById(myUserObjId) {
return await ProfileModel.aggregate([
{ "$match": { _id: myUserObjId}},
{ "$lookup": {
"from": friendsDao.FriendsModel.collection.name,
"let": { "friends": "$friends" },
"pipeline": [
{ "$match": {
"recipient": myUserObjId,
"$expr": { "$in": [ "$_id", "$$friends" ] }
}},
{ "$project": { "status": 1 } }
],
"as": "friends"
}},
{ "$addFields": {
"friendsStatus": {
"$ifNull": [ { "$min": "$friends.status" }, 0 ]
}
}}
])
}
API-вызов работает. Когда я удаляю { "$match": { _id: myUserObjId}}
из запроса. Я получаю все профили, хранящиеся в БД. Что не то, что я хочу. Только пользователи, с которыми я дружу, получили запрос или имеют ожидающий запрос.
Ссылка: Моделирование для схемы друзей в пн goose? При создании я использовал следующую ссылку мои схемы и запрос