#node.js #mongodb #mongoose #mongodb-query
#node.js #mongodb #мангуст #mongodb-запрос
Вопрос:
у меня есть схема пользователя и схема post .. в пользовательской схеме есть поле массива «posts», которое ссылается на схему post, а в пользовательской схеме содержится поле массива «followings», ссылающееся на схему пользователя.. Это схема пользователя
const UserSchema = new mongoose.Schema({
name: {
type: String,
//required: true
},
email: {
type: String,
//required: true
},
dob: {
type: Date,
//required: true
},
username: {
type: String,
//required: true
},
posts :[
{type: mongoose.Schema.Types.ObjectId,ref:'Post'}
],
password: {
type: String,
// required: true
},
followers: [{
type: mongoose.Schema.Types.ObjectId , ref:'User'
}],
following: [{
type: mongoose.Schema.Types.ObjectId , ref:'User'
}]
});
и схема post
const PostSchema = new mongoose.Schema({
body: {
type: String
},
topic: {
type: mongoose.Schema.Types.ObjectId, ref: 'Topics'
},
title: {
type: String
},
createdBy:{
type: mongoose.Schema.Types.ObjectId, ref: 'User'
},
createdAt: {
type: Date,
default: Date.now()
},
comments:[{
type: mongoose.Schema.Types.ObjectId , ref:'Comment'
}],
updatedAt:{
type: Date,
default: Date.now()
}
});
я застрял на том, как запрашивать mongoose для всех сообщений пользователей, за которыми он следит,
как мне запросить все сообщения пользователей, спасибо
Ответ №1:
Используйте агрегатную функцию.
- отфильтруйте результат для пользователя, используя $match .
- $ размотайте «следующее» поле (поскольку локальное поле не может быть массивом на следующем этапе).
- найдите записи, используя $lookup
- очистите свой вывод с помощью $project.
решение должно быть примерно таким (не тестировалось):
db.users.aggregate([
{
"$match":{
"username":"user_username"
}
},
{
"$unwind":"$following"
},
{
"$lookup":{
"from":"posts",
"localField":"following",
"foreignField":"createdBy",
"as":"posts"
}
},
{
"$project":{
"posts":1,
"following":1,
"_id":0
}
}
])